mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 05:54:32 +00:00 
			
		
		
		
	Compare commits
	
		
			9 Commits
		
	
	
		
			feature/ha
			...
			feature/ha
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					e307bb7528 | ||
| 
						 | 
					5b8b630919 | ||
| 
						 | 
					81287133f3 | ||
| 
						 | 
					bd27940f78 | ||
| 
						 | 
					d45647698d | ||
| 
						 | 
					d6ac6e75cc | ||
| 
						 | 
					ba34d7b206 | ||
| 
						 | 
					80003787c9 | ||
| 
						 | 
					f523dddef0 | 
							
								
								
									
										26
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -83,7 +83,6 @@ ltmain.sh
 | 
			
		||||
.Trashes
 | 
			
		||||
ehthumbs.db
 | 
			
		||||
Thumbs.db
 | 
			
		||||
.dirstamp
 | 
			
		||||
 | 
			
		||||
# build directory #
 | 
			
		||||
###################
 | 
			
		||||
@@ -98,8 +97,11 @@ build.sh
 | 
			
		||||
 | 
			
		||||
# Eigen source #
 | 
			
		||||
################
 | 
			
		||||
Grid/Eigen
 | 
			
		||||
Eigen/*
 | 
			
		||||
lib/Eigen/*
 | 
			
		||||
 | 
			
		||||
# FFTW source #
 | 
			
		||||
################
 | 
			
		||||
lib/fftw/*
 | 
			
		||||
 | 
			
		||||
# libtool macros #
 | 
			
		||||
##################
 | 
			
		||||
@@ -110,7 +112,21 @@ m4/libtool.m4
 | 
			
		||||
################
 | 
			
		||||
gh-pages/
 | 
			
		||||
 | 
			
		||||
# Buck files #
 | 
			
		||||
##############
 | 
			
		||||
.buck*
 | 
			
		||||
buck-out
 | 
			
		||||
BUCK
 | 
			
		||||
make-bin-BUCK.sh
 | 
			
		||||
 | 
			
		||||
# generated sources #
 | 
			
		||||
#####################
 | 
			
		||||
Grid/qcd/spin/gamma-gen/*.h
 | 
			
		||||
Grid/qcd/spin/gamma-gen/*.cc
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -9,11 +9,6 @@ matrix:
 | 
			
		||||
    - os:        osx
 | 
			
		||||
      osx_image: xcode8.3
 | 
			
		||||
      compiler: clang
 | 
			
		||||
      env: PREC=single
 | 
			
		||||
    - os:        osx
 | 
			
		||||
      osx_image: xcode8.3
 | 
			
		||||
      compiler: clang
 | 
			
		||||
      env: PREC=double
 | 
			
		||||
      
 | 
			
		||||
before_install:
 | 
			
		||||
    - export GRIDDIR=`pwd`
 | 
			
		||||
@@ -21,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 openssl; fi
 | 
			
		||||
    - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libmpc; fi
 | 
			
		||||
    
 | 
			
		||||
install:
 | 
			
		||||
    - export CWD=`pwd`
 | 
			
		||||
@@ -38,7 +33,6 @@ 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
 | 
			
		||||
@@ -55,7 +49,12 @@ script:
 | 
			
		||||
    - make -j4
 | 
			
		||||
    - make install
 | 
			
		||||
    - cd $CWD/build
 | 
			
		||||
    - ../configure --enable-precision=$PREC --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install ${EXTRACONF}
 | 
			
		||||
    - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install
 | 
			
		||||
    - 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
 | 
			
		||||
    - make -j4
 | 
			
		||||
    - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals
 | 
			
		||||
    - make check
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,473 +0,0 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/algorithms/iterative/SchurRedBlack.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_SCHUR_RED_BLACK_H
 | 
			
		||||
#define GRID_SCHUR_RED_BLACK_H
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Red black Schur decomposition
 | 
			
		||||
   *
 | 
			
		||||
   *  M = (Mee Meo) =  (1             0 )   (Mee   0               )  (1 Mee^{-1} Meo)
 | 
			
		||||
   *      (Moe Moo)    (Moe Mee^-1    1 )   (0   Moo-Moe Mee^-1 Meo)  (0   1         )
 | 
			
		||||
   *                =         L                     D                     U
 | 
			
		||||
   *
 | 
			
		||||
   * L^-1 = (1              0 )
 | 
			
		||||
   *        (-MoeMee^{-1}   1 )   
 | 
			
		||||
   * L^{dag} = ( 1       Mee^{-dag} Moe^{dag} )
 | 
			
		||||
   *           ( 0       1                    )
 | 
			
		||||
   * L^{-d}  = ( 1      -Mee^{-dag} Moe^{dag} )
 | 
			
		||||
   *           ( 0       1                    )
 | 
			
		||||
   *
 | 
			
		||||
   * U^-1 = (1   -Mee^{-1} Meo)
 | 
			
		||||
   *        (0    1           )
 | 
			
		||||
   * U^{dag} = ( 1                 0)
 | 
			
		||||
   *           (Meo^dag Mee^{-dag} 1)
 | 
			
		||||
   * U^{-dag} = (  1                 0)
 | 
			
		||||
   *            (-Meo^dag Mee^{-dag} 1)
 | 
			
		||||
   ***********************
 | 
			
		||||
   *     M psi = eta
 | 
			
		||||
   ***********************
 | 
			
		||||
   *Odd
 | 
			
		||||
   * i)                 D_oo psi_o =  L^{-1}  eta_o
 | 
			
		||||
   *                        eta_o' = (D_oo)^dag (eta_o - Moe Mee^{-1} eta_e)
 | 
			
		||||
   *
 | 
			
		||||
   * Wilson:
 | 
			
		||||
   *      (D_oo)^{\dag} D_oo psi_o = (D_oo)^dag L^{-1}  eta_o
 | 
			
		||||
   * Stag:
 | 
			
		||||
   *      D_oo psi_o = L^{-1}  eta =    (eta_o - Moe Mee^{-1} eta_e)
 | 
			
		||||
   *
 | 
			
		||||
   * L^-1 eta_o= (1              0 ) (e
 | 
			
		||||
   *             (-MoeMee^{-1}   1 )   
 | 
			
		||||
   *
 | 
			
		||||
   *Even
 | 
			
		||||
   * ii)  Mee psi_e + Meo psi_o = src_e
 | 
			
		||||
   *
 | 
			
		||||
   *   => sol_e = M_ee^-1 * ( src_e - Meo sol_o )...
 | 
			
		||||
   *
 | 
			
		||||
   * 
 | 
			
		||||
   * TODO: Other options:
 | 
			
		||||
   * 
 | 
			
		||||
   * a) change checkerboards for Schur e<->o
 | 
			
		||||
   *
 | 
			
		||||
   * Left precon by Moo^-1
 | 
			
		||||
   * b) Doo^{dag} M_oo^-dag Moo^-1 Doo psi_0 =  (D_oo)^dag M_oo^-dag Moo^-1 L^{-1}  eta_o
 | 
			
		||||
   *                              eta_o'     = (D_oo)^dag  M_oo^-dag Moo^-1 (eta_o - Moe Mee^{-1} eta_e)
 | 
			
		||||
   *
 | 
			
		||||
   * Right precon by Moo^-1
 | 
			
		||||
   * c) M_oo^-dag Doo^{dag} Doo Moo^-1 phi_0 = M_oo^-dag (D_oo)^dag L^{-1}  eta_o
 | 
			
		||||
   *                              eta_o'     = M_oo^-dag (D_oo)^dag (eta_o - Moe Mee^{-1} eta_e)
 | 
			
		||||
   *                              psi_o = M_oo^-1 phi_o
 | 
			
		||||
   * TODO: Deflation 
 | 
			
		||||
   */
 | 
			
		||||
namespace Grid {
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Use base class to share code
 | 
			
		||||
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // 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 SchurRedBlackBase {
 | 
			
		||||
  protected:
 | 
			
		||||
    typedef CheckerBoardedSparseMatrixBase<Field> Matrix;
 | 
			
		||||
    OperatorFunction<Field> & _HermitianRBSolver;
 | 
			
		||||
    int CBfactorise;
 | 
			
		||||
    bool subGuess;
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
    SchurRedBlackBase(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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /////////////////////////////////////////////////////////////
 | 
			
		||||
    // Shared code
 | 
			
		||||
    /////////////////////////////////////////////////////////////
 | 
			
		||||
    void operator() (Matrix & _Matrix,const Field &in, Field &out){
 | 
			
		||||
      ZeroGuesser<Field> guess;
 | 
			
		||||
      (*this)(_Matrix,in,out,guess);
 | 
			
		||||
    }
 | 
			
		||||
    void operator()(Matrix &_Matrix, const std::vector<Field> &in, std::vector<Field> &out) 
 | 
			
		||||
    {
 | 
			
		||||
      ZeroGuesser<Field> guess;
 | 
			
		||||
      (*this)(_Matrix,in,out,guess);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Guesser>
 | 
			
		||||
    void operator()(Matrix &_Matrix, const std::vector<Field> &in, std::vector<Field> &out,Guesser &guess) 
 | 
			
		||||
    {
 | 
			
		||||
      GridBase *grid = _Matrix.RedBlackGrid();
 | 
			
		||||
      GridBase *fgrid= _Matrix.Grid();
 | 
			
		||||
      int nblock = in.size();
 | 
			
		||||
 | 
			
		||||
      std::vector<Field> src_o(nblock,grid);
 | 
			
		||||
      std::vector<Field> sol_o(nblock,grid);
 | 
			
		||||
      
 | 
			
		||||
      std::vector<Field> guess_save;
 | 
			
		||||
 | 
			
		||||
      Field resid(fgrid);
 | 
			
		||||
      Field tmp(grid);
 | 
			
		||||
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      // Prepare RedBlack source
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      for(int b=0;b<nblock;b++){
 | 
			
		||||
	RedBlackSource(_Matrix,in[b],tmp,src_o[b]);
 | 
			
		||||
      }
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      // Make the guesses
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      if ( subGuess ) guess_save.resize(nblock,grid);
 | 
			
		||||
 | 
			
		||||
      for(int b=0;b<nblock;b++){
 | 
			
		||||
	guess(src_o[b],sol_o[b]); 
 | 
			
		||||
 | 
			
		||||
	if ( subGuess ) { 
 | 
			
		||||
	  guess_save[b] = sol_o[b];
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
      //////////////////////////////////////////////////////////////
 | 
			
		||||
      // Call the block solver
 | 
			
		||||
      //////////////////////////////////////////////////////////////
 | 
			
		||||
      std::cout<<GridLogMessage << "SchurRedBlackBase calling the solver for "<<nblock<<" RHS" <<std::endl;
 | 
			
		||||
      RedBlackSolve(_Matrix,src_o,sol_o);
 | 
			
		||||
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      // A2A boolean behavioural control & reconstruct other checkerboard
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      for(int b=0;b<nblock;b++) {
 | 
			
		||||
 | 
			
		||||
	if (subGuess)   sol_o[b] = sol_o[b] - guess_save[b];
 | 
			
		||||
 | 
			
		||||
	///////// Needs even source //////////////
 | 
			
		||||
	pickCheckerboard(Even,tmp,in[b]);
 | 
			
		||||
	RedBlackSolution(_Matrix,sol_o[b],tmp,out[b]);
 | 
			
		||||
 | 
			
		||||
	/////////////////////////////////////////////////
 | 
			
		||||
	// Check unprec residual if possible
 | 
			
		||||
	/////////////////////////////////////////////////
 | 
			
		||||
	if ( ! subGuess ) {
 | 
			
		||||
	  _Matrix.M(out[b],resid); 
 | 
			
		||||
	  resid = resid-in[b];
 | 
			
		||||
	  RealD ns = norm2(in[b]);
 | 
			
		||||
	  RealD nr = norm2(resid);
 | 
			
		||||
	
 | 
			
		||||
	  std::cout<<GridLogMessage<< "SchurRedBlackBase solver true unprec resid["<<b<<"] "<<std::sqrt(nr/ns) << std::endl;
 | 
			
		||||
	} else {
 | 
			
		||||
	  std::cout<<GridLogMessage<< "SchurRedBlackBase Guess subtracted after solve["<<b<<"] " << std::endl;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    template<class Guesser>
 | 
			
		||||
    void operator() (Matrix & _Matrix,const Field &in, Field &out,Guesser &guess){
 | 
			
		||||
 | 
			
		||||
      // FIXME CGdiagonalMee not implemented virtual function
 | 
			
		||||
      // FIXME use CBfactorise to control schur decomp
 | 
			
		||||
      GridBase *grid = _Matrix.RedBlackGrid();
 | 
			
		||||
      GridBase *fgrid= _Matrix.Grid();
 | 
			
		||||
 | 
			
		||||
      Field resid(fgrid);
 | 
			
		||||
      Field src_o(grid);
 | 
			
		||||
      Field src_e(grid);
 | 
			
		||||
      Field sol_o(grid);
 | 
			
		||||
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      // RedBlack source
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      RedBlackSource(_Matrix,in,src_e,src_o);
 | 
			
		||||
 | 
			
		||||
      ////////////////////////////////
 | 
			
		||||
      // Construct the guess
 | 
			
		||||
      ////////////////////////////////
 | 
			
		||||
      Field   tmp(grid);
 | 
			
		||||
      guess(src_o,sol_o);
 | 
			
		||||
 | 
			
		||||
      Field  guess_save(grid);
 | 
			
		||||
      guess_save = sol_o;
 | 
			
		||||
 | 
			
		||||
      //////////////////////////////////////////////////////////////
 | 
			
		||||
      // Call the red-black solver
 | 
			
		||||
      //////////////////////////////////////////////////////////////
 | 
			
		||||
      RedBlackSolve(_Matrix,src_o,sol_o);
 | 
			
		||||
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      // Fionn A2A boolean behavioural control
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      if (subGuess)      sol_o= sol_o-guess_save;
 | 
			
		||||
 | 
			
		||||
      ///////////////////////////////////////////////////
 | 
			
		||||
      // RedBlack solution needs the even source
 | 
			
		||||
      ///////////////////////////////////////////////////
 | 
			
		||||
      RedBlackSolution(_Matrix,sol_o,src_e,out);
 | 
			
		||||
 | 
			
		||||
      // Verify the unprec residual
 | 
			
		||||
      if ( ! subGuess ) {
 | 
			
		||||
        _Matrix.M(out,resid); 
 | 
			
		||||
        resid = resid-in;
 | 
			
		||||
        RealD ns = norm2(in);
 | 
			
		||||
        RealD nr = norm2(resid);
 | 
			
		||||
 | 
			
		||||
        std::cout<<GridLogMessage << "SchurRedBlackBase solver true unprec resid "<< std::sqrt(nr/ns) << std::endl;
 | 
			
		||||
      } else {
 | 
			
		||||
        std::cout << GridLogMessage << "SchurRedBlackBase Guess subtracted after solve." << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
    }     
 | 
			
		||||
    
 | 
			
		||||
    /////////////////////////////////////////////////////////////
 | 
			
		||||
    // Override in derived. Not virtual as template methods
 | 
			
		||||
    /////////////////////////////////////////////////////////////
 | 
			
		||||
    virtual void RedBlackSource  (Matrix & _Matrix,const Field &src, Field &src_e,Field &src_o)                =0;
 | 
			
		||||
    virtual void RedBlackSolution(Matrix & _Matrix,const Field &sol_o, const Field &src_e,Field &sol)          =0;
 | 
			
		||||
    virtual void RedBlackSolve   (Matrix & _Matrix,const Field &src_o, Field &sol_o)                           =0;
 | 
			
		||||
    virtual void RedBlackSolve   (Matrix & _Matrix,const std::vector<Field> &src_o,  std::vector<Field> &sol_o)=0;
 | 
			
		||||
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template<class Field> class SchurRedBlackStaggeredSolve : public SchurRedBlackBase<Field> {
 | 
			
		||||
  public:
 | 
			
		||||
    typedef CheckerBoardedSparseMatrixBase<Field> Matrix;
 | 
			
		||||
 | 
			
		||||
    SchurRedBlackStaggeredSolve(OperatorFunction<Field> &HermitianRBSolver, const bool initSubGuess = false) 
 | 
			
		||||
      :    SchurRedBlackBase<Field> (HermitianRBSolver,initSubGuess) 
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //////////////////////////////////////////////////////
 | 
			
		||||
    // Override RedBlack specialisation
 | 
			
		||||
    //////////////////////////////////////////////////////
 | 
			
		||||
    virtual void RedBlackSource(Matrix & _Matrix,const Field &src, Field &src_e,Field &src_o)
 | 
			
		||||
    {
 | 
			
		||||
      GridBase *grid = _Matrix.RedBlackGrid();
 | 
			
		||||
      GridBase *fgrid= _Matrix.Grid();
 | 
			
		||||
 | 
			
		||||
      Field   tmp(grid);
 | 
			
		||||
      Field  Mtmp(grid);
 | 
			
		||||
 | 
			
		||||
      pickCheckerboard(Even,src_e,src);
 | 
			
		||||
      pickCheckerboard(Odd ,src_o,src);
 | 
			
		||||
 | 
			
		||||
      /////////////////////////////////////////////////////
 | 
			
		||||
      // src_o = (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);     
 | 
			
		||||
 | 
			
		||||
      _Matrix.Mooee(tmp,src_o); // Extra factor of "m" in source from dumb choice of matrix norm.
 | 
			
		||||
    }
 | 
			
		||||
    virtual void RedBlackSolution(Matrix & _Matrix,const Field &sol_o, const Field &src_e_c,Field &sol)
 | 
			
		||||
    {
 | 
			
		||||
      GridBase *grid = _Matrix.RedBlackGrid();
 | 
			
		||||
      GridBase *fgrid= _Matrix.Grid();
 | 
			
		||||
 | 
			
		||||
      Field   tmp(grid);
 | 
			
		||||
      Field   sol_e(grid);
 | 
			
		||||
      Field   src_e(grid);
 | 
			
		||||
 | 
			
		||||
      src_e = src_e_c; // Const correctness
 | 
			
		||||
 | 
			
		||||
      ///////////////////////////////////////////////////
 | 
			
		||||
      // 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(sol,sol_e); assert(  sol_e.checkerboard ==Even);
 | 
			
		||||
      setCheckerboard(sol,sol_o); assert(  sol_o.checkerboard ==Odd );
 | 
			
		||||
    }
 | 
			
		||||
    virtual void RedBlackSolve   (Matrix & _Matrix,const Field &src_o, Field &sol_o)
 | 
			
		||||
    {
 | 
			
		||||
      SchurStaggeredOperator<Matrix,Field> _HermOpEO(_Matrix);
 | 
			
		||||
      this->_HermitianRBSolver(_HermOpEO,src_o,sol_o);  assert(sol_o.checkerboard==Odd);
 | 
			
		||||
    };
 | 
			
		||||
    virtual void RedBlackSolve   (Matrix & _Matrix,const std::vector<Field> &src_o,  std::vector<Field> &sol_o)
 | 
			
		||||
    {
 | 
			
		||||
      SchurStaggeredOperator<Matrix,Field> _HermOpEO(_Matrix);
 | 
			
		||||
      this->_HermitianRBSolver(_HermOpEO,src_o,sol_o); 
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
  template<class Field> using SchurRedBlackStagSolve = SchurRedBlackStaggeredSolve<Field>;
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Site diagonal has Mooee on it.
 | 
			
		||||
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  template<class Field> class SchurRedBlackDiagMooeeSolve : public SchurRedBlackBase<Field> {
 | 
			
		||||
  public:
 | 
			
		||||
    typedef CheckerBoardedSparseMatrixBase<Field> Matrix;
 | 
			
		||||
 | 
			
		||||
    SchurRedBlackDiagMooeeSolve(OperatorFunction<Field> &HermitianRBSolver, const bool initSubGuess = false)  
 | 
			
		||||
      : SchurRedBlackBase<Field> (HermitianRBSolver,initSubGuess) {};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //////////////////////////////////////////////////////
 | 
			
		||||
    // Override RedBlack specialisation
 | 
			
		||||
    //////////////////////////////////////////////////////
 | 
			
		||||
    virtual void RedBlackSource(Matrix & _Matrix,const Field &src, Field &src_e,Field &src_o)
 | 
			
		||||
    {
 | 
			
		||||
      GridBase *grid = _Matrix.RedBlackGrid();
 | 
			
		||||
      GridBase *fgrid= _Matrix.Grid();
 | 
			
		||||
 | 
			
		||||
      Field   tmp(grid);
 | 
			
		||||
      Field  Mtmp(grid);
 | 
			
		||||
 | 
			
		||||
      pickCheckerboard(Even,src_e,src);
 | 
			
		||||
      pickCheckerboard(Odd ,src_o,src);
 | 
			
		||||
 | 
			
		||||
      /////////////////////////////////////////////////////
 | 
			
		||||
      // 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
 | 
			
		||||
      SchurDiagMooeeOperator<Matrix,Field> _HermOpEO(_Matrix);
 | 
			
		||||
      _HermOpEO.MpcDag(tmp,src_o);     assert(src_o.checkerboard ==Odd);       
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    virtual void RedBlackSolution(Matrix & _Matrix,const Field &sol_o, const Field &src_e,Field &sol)
 | 
			
		||||
    {
 | 
			
		||||
      GridBase *grid = _Matrix.RedBlackGrid();
 | 
			
		||||
      GridBase *fgrid= _Matrix.Grid();
 | 
			
		||||
 | 
			
		||||
      Field   tmp(grid);
 | 
			
		||||
      Field  sol_e(grid);
 | 
			
		||||
      Field  src_e_i(grid);
 | 
			
		||||
      ///////////////////////////////////////////////////
 | 
			
		||||
      // sol_e = M_ee^-1 * ( src_e - Meo sol_o )...
 | 
			
		||||
      ///////////////////////////////////////////////////
 | 
			
		||||
      _Matrix.Meooe(sol_o,tmp);          assert(  tmp.checkerboard   ==Even);
 | 
			
		||||
      src_e_i = src_e-tmp;               assert(  src_e_i.checkerboard ==Even);
 | 
			
		||||
      _Matrix.MooeeInv(src_e_i,sol_e);   assert(  sol_e.checkerboard ==Even);
 | 
			
		||||
     
 | 
			
		||||
      setCheckerboard(sol,sol_e); assert(  sol_e.checkerboard ==Even);
 | 
			
		||||
      setCheckerboard(sol,sol_o); assert(  sol_o.checkerboard ==Odd );
 | 
			
		||||
    }
 | 
			
		||||
    virtual void RedBlackSolve   (Matrix & _Matrix,const Field &src_o, Field &sol_o)
 | 
			
		||||
    {
 | 
			
		||||
      SchurDiagMooeeOperator<Matrix,Field> _HermOpEO(_Matrix);
 | 
			
		||||
      this->_HermitianRBSolver(_HermOpEO,src_o,sol_o);  assert(sol_o.checkerboard==Odd);
 | 
			
		||||
    };
 | 
			
		||||
    virtual void RedBlackSolve   (Matrix & _Matrix,const std::vector<Field> &src_o,  std::vector<Field> &sol_o)
 | 
			
		||||
    {
 | 
			
		||||
      SchurDiagMooeeOperator<Matrix,Field> _HermOpEO(_Matrix);
 | 
			
		||||
      this->_HermitianRBSolver(_HermOpEO,src_o,sol_o); 
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Site diagonal is identity, right preconditioned by Mee^inv
 | 
			
		||||
  // ( 1 - Meo Moo^inv Moe Mee^inv  ) phi =( 1 - Meo Moo^inv Moe Mee^inv  ) Mee psi =  = eta  = eta
 | 
			
		||||
  //=> psi = MeeInv phi
 | 
			
		||||
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  template<class Field> class SchurRedBlackDiagTwoSolve : public SchurRedBlackBase<Field> {
 | 
			
		||||
  public:
 | 
			
		||||
    typedef CheckerBoardedSparseMatrixBase<Field> Matrix;
 | 
			
		||||
 | 
			
		||||
    /////////////////////////////////////////////////////
 | 
			
		||||
    // Wrap the usual normal equations Schur trick
 | 
			
		||||
    /////////////////////////////////////////////////////
 | 
			
		||||
  SchurRedBlackDiagTwoSolve(OperatorFunction<Field> &HermitianRBSolver, const bool initSubGuess = false)  
 | 
			
		||||
    : SchurRedBlackBase<Field>(HermitianRBSolver,initSubGuess) {};
 | 
			
		||||
 | 
			
		||||
    virtual void RedBlackSource(Matrix & _Matrix,const Field &src, Field &src_e,Field &src_o)
 | 
			
		||||
    {
 | 
			
		||||
      GridBase *grid = _Matrix.RedBlackGrid();
 | 
			
		||||
      GridBase *fgrid= _Matrix.Grid();
 | 
			
		||||
 | 
			
		||||
      SchurDiagTwoOperator<Matrix,Field> _HermOpEO(_Matrix);
 | 
			
		||||
      
 | 
			
		||||
      Field   tmp(grid);
 | 
			
		||||
      Field  Mtmp(grid);
 | 
			
		||||
 | 
			
		||||
      pickCheckerboard(Even,src_e,src);
 | 
			
		||||
      pickCheckerboard(Odd ,src_o,src);
 | 
			
		||||
    
 | 
			
		||||
      /////////////////////////////////////////////////////
 | 
			
		||||
      // 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);       
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void RedBlackSolution(Matrix & _Matrix,const Field &sol_o, const Field &src_e,Field &sol)
 | 
			
		||||
    {
 | 
			
		||||
      GridBase *grid = _Matrix.RedBlackGrid();
 | 
			
		||||
      GridBase *fgrid= _Matrix.Grid();
 | 
			
		||||
 | 
			
		||||
      Field   sol_o_i(grid);
 | 
			
		||||
      Field   tmp(grid);
 | 
			
		||||
      Field   sol_e(grid);
 | 
			
		||||
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      // MooeeInv due to pecond
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      _Matrix.MooeeInv(sol_o,tmp);
 | 
			
		||||
      sol_o_i = tmp;
 | 
			
		||||
 | 
			
		||||
      ///////////////////////////////////////////////////
 | 
			
		||||
      // sol_e = M_ee^-1 * ( src_e - Meo sol_o )...
 | 
			
		||||
      ///////////////////////////////////////////////////
 | 
			
		||||
      _Matrix.Meooe(sol_o_i,tmp);    assert(  tmp.checkerboard   ==Even);
 | 
			
		||||
      tmp = src_e-tmp;               assert(  src_e.checkerboard ==Even);
 | 
			
		||||
      _Matrix.MooeeInv(tmp,sol_e);   assert(  sol_e.checkerboard ==Even);
 | 
			
		||||
     
 | 
			
		||||
      setCheckerboard(sol,sol_e);    assert(  sol_e.checkerboard ==Even);
 | 
			
		||||
      setCheckerboard(sol,sol_o_i);  assert(  sol_o_i.checkerboard ==Odd );
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    virtual void RedBlackSolve   (Matrix & _Matrix,const Field &src_o, Field &sol_o)
 | 
			
		||||
    {
 | 
			
		||||
      SchurDiagTwoOperator<Matrix,Field> _HermOpEO(_Matrix);
 | 
			
		||||
      this->_HermitianRBSolver(_HermOpEO,src_o,sol_o);
 | 
			
		||||
    };
 | 
			
		||||
    virtual void RedBlackSolve   (Matrix & _Matrix,const std::vector<Field> &src_o,  std::vector<Field> &sol_o)
 | 
			
		||||
    {
 | 
			
		||||
      SchurDiagTwoOperator<Matrix,Field> _HermOpEO(_Matrix);
 | 
			
		||||
      this->_HermitianRBSolver(_HermOpEO,src_o,sol_o); 
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,237 +0,0 @@
 | 
			
		||||
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/qcd/action/fermion/FourierAcceleratedPV.h
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Christoph Lehner (lifted with permission by Peter Boyle, brought back to Grid)
 | 
			
		||||
Author: Peter Boyle <pabobyle@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 */
 | 
			
		||||
#pragma once
 | 
			
		||||
namespace Grid {
 | 
			
		||||
namespace QCD {
 | 
			
		||||
 | 
			
		||||
  template<typename M>
 | 
			
		||||
    void get_real_const_bc(M& m, RealD& _b, RealD& _c) {
 | 
			
		||||
    ComplexD b,c;
 | 
			
		||||
    b=m.bs[0];
 | 
			
		||||
    c=m.cs[0];
 | 
			
		||||
    std::cout << GridLogMessage << "b=" << b << ", c=" << c << std::endl;
 | 
			
		||||
    for (size_t i=1;i<m.bs.size();i++) {
 | 
			
		||||
      assert(m.bs[i] == b);
 | 
			
		||||
      assert(m.cs[i] == c);
 | 
			
		||||
    }
 | 
			
		||||
    assert(b.imag() == 0.0);
 | 
			
		||||
    assert(c.imag() == 0.0);
 | 
			
		||||
    _b = b.real();
 | 
			
		||||
    _c = c.real();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template<typename Vi, typename M, typename G>
 | 
			
		||||
class FourierAcceleratedPV {
 | 
			
		||||
 public:
 | 
			
		||||
 | 
			
		||||
  ConjugateGradient<Vi> &cg;
 | 
			
		||||
  M& dwfPV;
 | 
			
		||||
  G& Umu;
 | 
			
		||||
  GridCartesian* grid5D;
 | 
			
		||||
  GridRedBlackCartesian* gridRB5D;
 | 
			
		||||
  int group_in_s;
 | 
			
		||||
 | 
			
		||||
  FourierAcceleratedPV(M& _dwfPV, G& _Umu, ConjugateGradient<Vi> &_cg, int _group_in_s = 2) 
 | 
			
		||||
   : dwfPV(_dwfPV), Umu(_Umu), cg(_cg), group_in_s(_group_in_s) 
 | 
			
		||||
  {
 | 
			
		||||
    assert( dwfPV.FermionGrid()->_fdimensions[0] % (2*group_in_s) == 0);
 | 
			
		||||
    grid5D = QCD::SpaceTimeGrid::makeFiveDimGrid(2*group_in_s, (GridCartesian*)Umu._grid);
 | 
			
		||||
    gridRB5D = QCD::SpaceTimeGrid::makeFiveDimRedBlackGrid(2*group_in_s, (GridCartesian*)Umu._grid);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void rotatePV(const Vi& _src, Vi& dst, bool forward) const {
 | 
			
		||||
 | 
			
		||||
    GridStopWatch gsw1, gsw2;
 | 
			
		||||
 | 
			
		||||
    typedef typename Vi::scalar_type Coeff_t;
 | 
			
		||||
    int Ls = dst._grid->_fdimensions[0];
 | 
			
		||||
 | 
			
		||||
    Vi _tmp(dst._grid);
 | 
			
		||||
    double phase = M_PI / (double)Ls;
 | 
			
		||||
    Coeff_t bzero(0.0,0.0);
 | 
			
		||||
 | 
			
		||||
    FFT theFFT((GridCartesian*)dst._grid);
 | 
			
		||||
 | 
			
		||||
    if (!forward) {
 | 
			
		||||
      gsw1.Start();
 | 
			
		||||
      for (int s=0;s<Ls;s++) {
 | 
			
		||||
	Coeff_t a(::cos(phase*s),-::sin(phase*s));
 | 
			
		||||
	axpby_ssp(_tmp,a,_src,bzero,_src,s,s);
 | 
			
		||||
      }
 | 
			
		||||
      gsw1.Stop();
 | 
			
		||||
 | 
			
		||||
      gsw2.Start();
 | 
			
		||||
      theFFT.FFT_dim(dst,_tmp,0,FFT::forward);
 | 
			
		||||
      gsw2.Stop();
 | 
			
		||||
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
      gsw2.Start();
 | 
			
		||||
      theFFT.FFT_dim(_tmp,_src,0,FFT::backward);
 | 
			
		||||
      gsw2.Stop();
 | 
			
		||||
 | 
			
		||||
      gsw1.Start();
 | 
			
		||||
      for (int s=0;s<Ls;s++) {
 | 
			
		||||
	Coeff_t a(::cos(phase*s),::sin(phase*s));
 | 
			
		||||
	axpby_ssp(dst,a,_tmp,bzero,_tmp,s,s);
 | 
			
		||||
      }
 | 
			
		||||
      gsw1.Stop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::cout << GridLogMessage << "Timing rotatePV: " << gsw1.Elapsed() << ", " << gsw2.Elapsed() << std::endl;
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void pvInv(const Vi& _src, Vi& _dst) const {
 | 
			
		||||
 | 
			
		||||
    std::cout << GridLogMessage << "Fourier-Accelerated Outer Pauli Villars"<<std::endl;
 | 
			
		||||
 | 
			
		||||
    typedef typename Vi::scalar_type Coeff_t;
 | 
			
		||||
    int Ls = _dst._grid->_fdimensions[0];
 | 
			
		||||
 | 
			
		||||
    GridStopWatch gswT;
 | 
			
		||||
    gswT.Start();
 | 
			
		||||
 | 
			
		||||
    RealD b,c;
 | 
			
		||||
    get_real_const_bc(dwfPV,b,c);
 | 
			
		||||
    RealD M5 = dwfPV.M5;
 | 
			
		||||
    
 | 
			
		||||
    // U(true) Rightinv TMinv U(false) = Minv
 | 
			
		||||
 | 
			
		||||
    Vi _src_diag(_dst._grid);
 | 
			
		||||
    Vi _src_diag_slice(dwfPV.GaugeGrid());
 | 
			
		||||
    Vi _dst_diag_slice(dwfPV.GaugeGrid());
 | 
			
		||||
    Vi _src_diag_slices(grid5D);
 | 
			
		||||
    Vi _dst_diag_slices(grid5D);
 | 
			
		||||
    Vi _dst_diag(_dst._grid);
 | 
			
		||||
 | 
			
		||||
    rotatePV(_src,_src_diag,false);
 | 
			
		||||
 | 
			
		||||
    // now do TM solves
 | 
			
		||||
    Gamma G5(Gamma::Algebra::Gamma5);
 | 
			
		||||
 | 
			
		||||
    GridStopWatch gswA, gswB;
 | 
			
		||||
 | 
			
		||||
    gswA.Start();
 | 
			
		||||
 | 
			
		||||
    typedef typename M::Impl_t Impl;
 | 
			
		||||
    //WilsonTMFermion<Impl> tm(x.Umu,*x.UGridF,*x.UrbGridF,0.0,0.0,solver_outer.parent.par.wparams_f);
 | 
			
		||||
    std::vector<RealD> vmass(grid5D->_fdimensions[0],0.0);
 | 
			
		||||
    std::vector<RealD> vmu(grid5D->_fdimensions[0],0.0);
 | 
			
		||||
 | 
			
		||||
    WilsonTMFermion5D<Impl> tm(Umu,*grid5D,*gridRB5D,
 | 
			
		||||
			   *(GridCartesian*)dwfPV.GaugeGrid(),
 | 
			
		||||
			   *(GridRedBlackCartesian*)dwfPV.GaugeRedBlackGrid(),
 | 
			
		||||
			   vmass,vmu);
 | 
			
		||||
    
 | 
			
		||||
    //SchurRedBlackDiagTwoSolve<Vi> sol(cg);
 | 
			
		||||
    SchurRedBlackDiagMooeeSolve<Vi> sol(cg); // same performance as DiagTwo
 | 
			
		||||
    gswA.Stop();
 | 
			
		||||
 | 
			
		||||
    gswB.Start();
 | 
			
		||||
 | 
			
		||||
    for (int sgroup=0;sgroup<Ls/2/group_in_s;sgroup++) {
 | 
			
		||||
 | 
			
		||||
      for (int sidx=0;sidx<group_in_s;sidx++) {
 | 
			
		||||
 | 
			
		||||
	int s = sgroup*group_in_s + sidx;
 | 
			
		||||
	int sprime = Ls-s-1;
 | 
			
		||||
 | 
			
		||||
	RealD phase = M_PI / (RealD)Ls * (2.0 * s + 1.0);
 | 
			
		||||
	RealD cosp = ::cos(phase);
 | 
			
		||||
	RealD sinp = ::sin(phase);
 | 
			
		||||
	RealD denom = b*b + c*c + 2.0*b*c*cosp;
 | 
			
		||||
	RealD mass = -(b*b*M5 + c*(1.0 - cosp + c*M5) + b*(-1.0 + cosp + 2.0*c*cosp*M5))/denom;
 | 
			
		||||
	RealD mu = (b+c)*sinp/denom;
 | 
			
		||||
 | 
			
		||||
	vmass[2*sidx + 0] = mass;
 | 
			
		||||
	vmass[2*sidx + 1] = mass;
 | 
			
		||||
	vmu[2*sidx + 0] = mu;
 | 
			
		||||
	vmu[2*sidx + 1] = -mu;
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      tm.update(vmass,vmu);
 | 
			
		||||
 | 
			
		||||
      for (int sidx=0;sidx<group_in_s;sidx++) {
 | 
			
		||||
 | 
			
		||||
	int s = sgroup*group_in_s + sidx;
 | 
			
		||||
	int sprime = Ls-s-1;
 | 
			
		||||
 | 
			
		||||
	ExtractSlice(_src_diag_slice,_src_diag,s,0);
 | 
			
		||||
	InsertSlice(_src_diag_slice,_src_diag_slices,2*sidx + 0,0);
 | 
			
		||||
 | 
			
		||||
	ExtractSlice(_src_diag_slice,_src_diag,sprime,0);
 | 
			
		||||
	InsertSlice(_src_diag_slice,_src_diag_slices,2*sidx + 1,0);
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      GridStopWatch gsw;
 | 
			
		||||
      gsw.Start();
 | 
			
		||||
      _dst_diag_slices = zero; // zero guess
 | 
			
		||||
      sol(tm,_src_diag_slices,_dst_diag_slices);
 | 
			
		||||
      gsw.Stop();
 | 
			
		||||
      std::cout << GridLogMessage << "Solve[sgroup=" << sgroup << "] completed in " << gsw.Elapsed() << ", " << gswA.Elapsed() << std::endl;
 | 
			
		||||
 | 
			
		||||
      for (int sidx=0;sidx<group_in_s;sidx++) {
 | 
			
		||||
 | 
			
		||||
	int s = sgroup*group_in_s + sidx;
 | 
			
		||||
	int sprime = Ls-s-1;
 | 
			
		||||
 | 
			
		||||
	RealD phase = M_PI / (RealD)Ls * (2.0 * s + 1.0);
 | 
			
		||||
	RealD cosp = ::cos(phase);
 | 
			
		||||
	RealD sinp = ::sin(phase);
 | 
			
		||||
 | 
			
		||||
	// now rotate with inverse of
 | 
			
		||||
	Coeff_t pA = b + c*cosp;
 | 
			
		||||
	Coeff_t pB = - Coeff_t(0.0,1.0)*c*sinp;
 | 
			
		||||
	Coeff_t pABden = pA*pA - pB*pB;
 | 
			
		||||
	// (pA + pB * G5) * (pA - pB*G5) = (pA^2 - pB^2)
 | 
			
		||||
      
 | 
			
		||||
	ExtractSlice(_dst_diag_slice,_dst_diag_slices,2*sidx + 0,0);
 | 
			
		||||
	_dst_diag_slice = (pA/pABden) * _dst_diag_slice - (pB/pABden) * (G5 * _dst_diag_slice);
 | 
			
		||||
	InsertSlice(_dst_diag_slice,_dst_diag,s,0);
 | 
			
		||||
	
 | 
			
		||||
	ExtractSlice(_dst_diag_slice,_dst_diag_slices,2*sidx + 1,0);
 | 
			
		||||
	_dst_diag_slice = (pA/pABden) * _dst_diag_slice + (pB/pABden) * (G5 * _dst_diag_slice);
 | 
			
		||||
	InsertSlice(_dst_diag_slice,_dst_diag,sprime,0);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    gswB.Stop();
 | 
			
		||||
 | 
			
		||||
    rotatePV(_dst_diag,_dst,true);
 | 
			
		||||
 | 
			
		||||
    gswT.Stop();
 | 
			
		||||
    std::cout << GridLogMessage << "PV completed in " << gswT.Elapsed() << " (Setup: " << gswA.Elapsed() << ", s-loop: " << gswB.Elapsed() << ")" << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
}}
 | 
			
		||||
@@ -1,193 +0,0 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/algorithms/iterative/MADWF.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 */
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
namespace Grid {
 | 
			
		||||
namespace QCD {
 | 
			
		||||
 | 
			
		||||
template <class Fieldi, class Fieldo,IfNotSame<Fieldi,Fieldo> X=0>
 | 
			
		||||
inline void convert(const Fieldi &from,Fieldo &to) 
 | 
			
		||||
{
 | 
			
		||||
  precisionChange(to,from);
 | 
			
		||||
}
 | 
			
		||||
template <class Fieldi, class Fieldo,IfSame<Fieldi,Fieldo> X=0>
 | 
			
		||||
inline void convert(const Fieldi &from,Fieldo &to) 
 | 
			
		||||
{
 | 
			
		||||
  to=from;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Matrixo,class Matrixi,class PVinverter,class SchurSolver, class Guesser> 
 | 
			
		||||
class MADWF 
 | 
			
		||||
{
 | 
			
		||||
 private:
 | 
			
		||||
  typedef typename Matrixo::FermionField FermionFieldo;
 | 
			
		||||
  typedef typename Matrixi::FermionField FermionFieldi;
 | 
			
		||||
 | 
			
		||||
  PVinverter  & PauliVillarsSolvero;// For the outer field
 | 
			
		||||
  SchurSolver & SchurSolveri;       // For the inner approx field
 | 
			
		||||
  Guesser     & Guesseri;           // To deflate the inner approx solves
 | 
			
		||||
 | 
			
		||||
  Matrixo & Mato;                   // Action object for outer
 | 
			
		||||
  Matrixi & Mati;                   // Action object for inner
 | 
			
		||||
 | 
			
		||||
  RealD target_resid;
 | 
			
		||||
  int   maxiter;
 | 
			
		||||
 public:
 | 
			
		||||
 | 
			
		||||
  MADWF(Matrixo &_Mato,
 | 
			
		||||
	Matrixi &_Mati, 
 | 
			
		||||
	PVinverter &_PauliVillarsSolvero, 
 | 
			
		||||
	SchurSolver &_SchurSolveri,
 | 
			
		||||
	Guesser & _Guesseri,
 | 
			
		||||
	RealD resid,
 | 
			
		||||
	int _maxiter) :
 | 
			
		||||
 | 
			
		||||
  Mato(_Mato),Mati(_Mati),
 | 
			
		||||
    SchurSolveri(_SchurSolveri),
 | 
			
		||||
    PauliVillarsSolvero(_PauliVillarsSolvero),Guesseri(_Guesseri)
 | 
			
		||||
  {   
 | 
			
		||||
    target_resid=resid;
 | 
			
		||||
    maxiter     =_maxiter; 
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  void operator() (const FermionFieldo &src4,FermionFieldo &sol5)
 | 
			
		||||
  {
 | 
			
		||||
    std::cout << GridLogMessage<< " ************************************************" << std::endl;
 | 
			
		||||
    std::cout << GridLogMessage<< "  MADWF-like algorithm                           " << std::endl;
 | 
			
		||||
    std::cout << GridLogMessage<< " ************************************************" << std::endl;
 | 
			
		||||
 | 
			
		||||
    FermionFieldi    c0i(Mati.GaugeGrid()); // 4d 
 | 
			
		||||
    FermionFieldi    y0i(Mati.GaugeGrid()); // 4d
 | 
			
		||||
    FermionFieldo    c0 (Mato.GaugeGrid()); // 4d 
 | 
			
		||||
    FermionFieldo    y0 (Mato.GaugeGrid()); // 4d
 | 
			
		||||
 | 
			
		||||
    FermionFieldo    A(Mato.FermionGrid()); // Temporary outer
 | 
			
		||||
    FermionFieldo    B(Mato.FermionGrid()); // Temporary outer
 | 
			
		||||
    FermionFieldo    b(Mato.FermionGrid()); // 5d source
 | 
			
		||||
 | 
			
		||||
    FermionFieldo    c(Mato.FermionGrid()); // PVinv source; reused so store
 | 
			
		||||
    FermionFieldo    defect(Mato.FermionGrid()); // 5d source
 | 
			
		||||
 | 
			
		||||
    FermionFieldi   ci(Mati.FermionGrid()); 
 | 
			
		||||
    FermionFieldi   yi(Mati.FermionGrid()); 
 | 
			
		||||
    FermionFieldi   xi(Mati.FermionGrid()); 
 | 
			
		||||
    FermionFieldi srci(Mati.FermionGrid()); 
 | 
			
		||||
    FermionFieldi   Ai(Mati.FermionGrid()); 
 | 
			
		||||
 | 
			
		||||
    RealD m=Mati.Mass();
 | 
			
		||||
 | 
			
		||||
    ///////////////////////////////////////
 | 
			
		||||
    //Import source, include Dminus factors
 | 
			
		||||
    ///////////////////////////////////////
 | 
			
		||||
    Mato.ImportPhysicalFermionSource(src4,b); 
 | 
			
		||||
    std::cout << GridLogMessage << " src4 " <<norm2(src4)<<std::endl;
 | 
			
		||||
    std::cout << GridLogMessage << " b    " <<norm2(b)<<std::endl;
 | 
			
		||||
 | 
			
		||||
    defect = b;
 | 
			
		||||
    sol5=zero;
 | 
			
		||||
    for (int i=0;i<maxiter;i++) {
 | 
			
		||||
 | 
			
		||||
      ///////////////////////////////////////
 | 
			
		||||
      // Set up c0 from current defect
 | 
			
		||||
      ///////////////////////////////////////
 | 
			
		||||
      PauliVillarsSolvero(Mato,defect,A);
 | 
			
		||||
      Mato.Pdag(A,c);
 | 
			
		||||
      ExtractSlice(c0, c, 0 , 0);
 | 
			
		||||
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      // Solve the inner system with surface term c0
 | 
			
		||||
      ////////////////////////////////////////////////
 | 
			
		||||
      ci = zero;  
 | 
			
		||||
      convert(c0,c0i); // Possible precison change
 | 
			
		||||
      InsertSlice(c0i,ci,0, 0);
 | 
			
		||||
 | 
			
		||||
      // Dwm P y = Dwm x = D(1) P (c0,0,0,0)^T
 | 
			
		||||
      Mati.P(ci,Ai);
 | 
			
		||||
      Mati.SetMass(1.0);      Mati.M(Ai,srci);      Mati.SetMass(m);
 | 
			
		||||
      SchurSolveri(Mati,srci,xi,Guesseri); 
 | 
			
		||||
      Mati.Pdag(xi,yi);
 | 
			
		||||
      ExtractSlice(y0i, yi, 0 , 0);
 | 
			
		||||
      convert(y0i,y0); // Possible precision change
 | 
			
		||||
 | 
			
		||||
      //////////////////////////////////////
 | 
			
		||||
      // Propagate solution back to outer system
 | 
			
		||||
      // Build Pdag PV^-1 Dm P [-sol4,c2,c3... cL]
 | 
			
		||||
      //////////////////////////////////////
 | 
			
		||||
      c0 = - y0;
 | 
			
		||||
      InsertSlice(c0, c, 0   , 0);
 | 
			
		||||
 | 
			
		||||
      /////////////////////////////
 | 
			
		||||
      // Reconstruct the bulk solution Pdag PV^-1 Dm P 
 | 
			
		||||
      /////////////////////////////
 | 
			
		||||
      Mato.P(c,B);
 | 
			
		||||
      Mato.M(B,A);
 | 
			
		||||
      PauliVillarsSolvero(Mato,A,B);
 | 
			
		||||
      Mato.Pdag(B,A);
 | 
			
		||||
 | 
			
		||||
      //////////////////////////////
 | 
			
		||||
      // Reinsert surface prop
 | 
			
		||||
      //////////////////////////////
 | 
			
		||||
      InsertSlice(y0,A,0,0);
 | 
			
		||||
 | 
			
		||||
      //////////////////////////////
 | 
			
		||||
      // Convert from y back to x 
 | 
			
		||||
      //////////////////////////////
 | 
			
		||||
      Mato.P(A,B);
 | 
			
		||||
 | 
			
		||||
      //         sol5' = sol5 + M^-1 defect
 | 
			
		||||
      //               = sol5 + M^-1 src - M^-1 M sol5  ...
 | 
			
		||||
      sol5 = sol5 + B;
 | 
			
		||||
      std::cout << GridLogMessage << "***************************************" <<std::endl;
 | 
			
		||||
      std::cout << GridLogMessage << " Sol5 update "<<std::endl;
 | 
			
		||||
      std::cout << GridLogMessage << "***************************************" <<std::endl;
 | 
			
		||||
      std::cout << GridLogMessage << " Sol5 now "<<norm2(sol5)<<std::endl;
 | 
			
		||||
      std::cout << GridLogMessage << " delta    "<<norm2(B)<<std::endl;
 | 
			
		||||
 | 
			
		||||
       // New defect  = b - M sol5
 | 
			
		||||
       Mato.M(sol5,A);
 | 
			
		||||
       defect = b - A;
 | 
			
		||||
 | 
			
		||||
       std::cout << GridLogMessage << " defect   "<<norm2(defect)<<std::endl;
 | 
			
		||||
 | 
			
		||||
       double resid = ::sqrt(norm2(defect) / norm2(b));
 | 
			
		||||
       std::cout << GridLogMessage << "Residual " << i << ": " << resid  << std::endl;
 | 
			
		||||
       std::cout << GridLogMessage << "***************************************" <<std::endl;
 | 
			
		||||
 | 
			
		||||
       if (resid < target_resid) {
 | 
			
		||||
	 return;
 | 
			
		||||
       }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::cout << GridLogMessage << "MADWF : Exceeded maxiter "<<std::endl;
 | 
			
		||||
    assert(0);
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}}
 | 
			
		||||
@@ -1,95 +0,0 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/algorithms/iterative/SchurRedBlack.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 */
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
namespace Grid {
 | 
			
		||||
namespace QCD {
 | 
			
		||||
 | 
			
		||||
template<class Field>
 | 
			
		||||
class PauliVillarsSolverUnprec
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
  ConjugateGradient<Field> & CG;
 | 
			
		||||
  PauliVillarsSolverUnprec(  ConjugateGradient<Field> &_CG) : CG(_CG){};
 | 
			
		||||
 | 
			
		||||
  template<class Matrix>
 | 
			
		||||
  void operator() (Matrix &_Matrix,const Field &src,Field &sol)
 | 
			
		||||
  {
 | 
			
		||||
    RealD m = _Matrix.Mass();
 | 
			
		||||
    Field A  (_Matrix.FermionGrid());
 | 
			
		||||
 | 
			
		||||
    MdagMLinearOperator<Matrix,Field> HermOp(_Matrix);
 | 
			
		||||
 | 
			
		||||
    _Matrix.SetMass(1.0);
 | 
			
		||||
    _Matrix.Mdag(src,A);
 | 
			
		||||
    CG(HermOp,A,sol);
 | 
			
		||||
    _Matrix.SetMass(m);
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class Field,class SchurSolverType>
 | 
			
		||||
class PauliVillarsSolverRBprec
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
  SchurSolverType & SchurSolver;
 | 
			
		||||
  PauliVillarsSolverRBprec( SchurSolverType &_SchurSolver) : SchurSolver(_SchurSolver){};
 | 
			
		||||
 | 
			
		||||
  template<class Matrix>
 | 
			
		||||
  void operator() (Matrix &_Matrix,const Field &src,Field &sol)
 | 
			
		||||
  {
 | 
			
		||||
    RealD m = _Matrix.Mass();
 | 
			
		||||
    Field A  (_Matrix.FermionGrid());
 | 
			
		||||
 | 
			
		||||
    _Matrix.SetMass(1.0);
 | 
			
		||||
    SchurSolver(_Matrix,src,sol);
 | 
			
		||||
    _Matrix.SetMass(m);
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class Field,class GaugeField>
 | 
			
		||||
class PauliVillarsSolverFourierAccel
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
  GaugeField      & Umu;
 | 
			
		||||
  ConjugateGradient<Field> & CG;
 | 
			
		||||
 | 
			
		||||
  PauliVillarsSolverFourierAccel(GaugeField &_Umu,ConjugateGradient<Field> &_CG) :  Umu(_Umu), CG(_CG)
 | 
			
		||||
  {
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template<class Matrix>
 | 
			
		||||
  void operator() (Matrix &_Matrix,const Field &src,Field &sol)
 | 
			
		||||
  {
 | 
			
		||||
    FourierAcceleratedPV<Field, Matrix, typename Matrix::GaugeField > faPV(_Matrix,Umu,CG) ;
 | 
			
		||||
    faPV.pvInv(src,sol);
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,135 +0,0 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/algorithms/iterative/SchurRedBlack.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 */
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
namespace Grid {
 | 
			
		||||
namespace QCD {
 | 
			
		||||
 | 
			
		||||
template<class Field,class PVinverter> class Reconstruct5DfromPhysical {
 | 
			
		||||
 private:
 | 
			
		||||
  PVinverter & PauliVillarsSolver;
 | 
			
		||||
 public:
 | 
			
		||||
 | 
			
		||||
 /////////////////////////////////////////////////////
 | 
			
		||||
 // First cut works, 10 Oct 2018.
 | 
			
		||||
 //
 | 
			
		||||
 // Must form a plan to get this into production for Zmobius acceleration
 | 
			
		||||
 // of the Mobius exact AMA corrections.
 | 
			
		||||
 //
 | 
			
		||||
 // TODO : understand absence of contact term in eqns in Hantao's thesis
 | 
			
		||||
 //        sol4 is contact term subtracted, but thesis & Brower's paper suggests not.
 | 
			
		||||
 //
 | 
			
		||||
 // Step 1: Localise PV inverse in a routine. [DONE]
 | 
			
		||||
 // Step 2: Schur based PV inverse            [DONE]
 | 
			
		||||
 // Step 3: Fourier accelerated PV inverse    [DONE]
 | 
			
		||||
 //
 | 
			
		||||
 /////////////////////////////////////////////////////
 | 
			
		||||
 
 | 
			
		||||
  Reconstruct5DfromPhysical(PVinverter &_PauliVillarsSolver) 
 | 
			
		||||
    : PauliVillarsSolver(_PauliVillarsSolver) 
 | 
			
		||||
  { 
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   template<class Matrix>
 | 
			
		||||
   void PV(Matrix &_Matrix,const Field &src,Field &sol)
 | 
			
		||||
   {
 | 
			
		||||
     RealD m = _Matrix.Mass();
 | 
			
		||||
     _Matrix.SetMass(1.0);
 | 
			
		||||
     _Matrix.M(src,sol);
 | 
			
		||||
     _Matrix.SetMass(m);
 | 
			
		||||
   }
 | 
			
		||||
   template<class Matrix>
 | 
			
		||||
   void PVdag(Matrix &_Matrix,const Field &src,Field &sol)
 | 
			
		||||
   {
 | 
			
		||||
     RealD m = _Matrix.Mass();
 | 
			
		||||
     _Matrix.SetMass(1.0);
 | 
			
		||||
     _Matrix.Mdag(src,sol);
 | 
			
		||||
     _Matrix.SetMass(m);
 | 
			
		||||
   }
 | 
			
		||||
  template<class Matrix>
 | 
			
		||||
  void operator() (Matrix & _Matrix,const Field &sol4,const Field &src4, Field &sol5){
 | 
			
		||||
 | 
			
		||||
    int Ls =  _Matrix.Ls;
 | 
			
		||||
 | 
			
		||||
    Field psi4(_Matrix.GaugeGrid());
 | 
			
		||||
    Field psi(_Matrix.FermionGrid());
 | 
			
		||||
    Field A  (_Matrix.FermionGrid());
 | 
			
		||||
    Field B  (_Matrix.FermionGrid());
 | 
			
		||||
    Field c  (_Matrix.FermionGrid());
 | 
			
		||||
 | 
			
		||||
    typedef typename Matrix::Coeff_t Coeff_t;
 | 
			
		||||
 | 
			
		||||
    std::cout << GridLogMessage<< " ************************************************" << std::endl;
 | 
			
		||||
    std::cout << GridLogMessage<< " Reconstruct5Dprop: c.f. MADWF algorithm         " << std::endl;
 | 
			
		||||
    std::cout << GridLogMessage<< " ************************************************" << std::endl;
 | 
			
		||||
 | 
			
		||||
    ///////////////////////////////////////
 | 
			
		||||
    //Import source, include Dminus factors
 | 
			
		||||
    ///////////////////////////////////////
 | 
			
		||||
    _Matrix.ImportPhysicalFermionSource(src4,B); 
 | 
			
		||||
 | 
			
		||||
    ///////////////////////////////////////
 | 
			
		||||
    // Set up c from src4
 | 
			
		||||
    ///////////////////////////////////////
 | 
			
		||||
    PauliVillarsSolver(_Matrix,B,A);
 | 
			
		||||
    _Matrix.Pdag(A,c);
 | 
			
		||||
 | 
			
		||||
    //////////////////////////////////////
 | 
			
		||||
    // Build Pdag PV^-1 Dm P [-sol4,c2,c3... cL]
 | 
			
		||||
    //////////////////////////////////////
 | 
			
		||||
    psi4 = - sol4;
 | 
			
		||||
    InsertSlice(psi4, psi, 0   , 0);
 | 
			
		||||
    for (int s=1;s<Ls;s++) {
 | 
			
		||||
      ExtractSlice(psi4,c,s,0);
 | 
			
		||||
       InsertSlice(psi4,psi,s,0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /////////////////////////////
 | 
			
		||||
    // Pdag PV^-1 Dm P 
 | 
			
		||||
    /////////////////////////////
 | 
			
		||||
    _Matrix.P(psi,B);
 | 
			
		||||
    _Matrix.M(B,A);
 | 
			
		||||
    PauliVillarsSolver(_Matrix,A,B);
 | 
			
		||||
    _Matrix.Pdag(B,A);
 | 
			
		||||
 | 
			
		||||
    //////////////////////////////
 | 
			
		||||
    // Reinsert surface prop
 | 
			
		||||
    //////////////////////////////
 | 
			
		||||
    InsertSlice(sol4,A,0,0);
 | 
			
		||||
 | 
			
		||||
    //////////////////////////////
 | 
			
		||||
    // Convert from y back to x 
 | 
			
		||||
    //////////////////////////////
 | 
			
		||||
    _Matrix.P(A,sol5);
 | 
			
		||||
    
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,155 +0,0 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/qcd/action/fermion/WilsonTMFermion5D.h
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: paboyle <paboyle@ph.ed.ac.uk> ; NB Christoph did similar in GPT
 | 
			
		||||
 | 
			
		||||
    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 */
 | 
			
		||||
#pragma once 
 | 
			
		||||
 | 
			
		||||
#include <Grid/qcd/action/fermion/FermionCore.h>
 | 
			
		||||
#include <Grid/qcd/action/fermion/WilsonFermion.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace Grid {
 | 
			
		||||
 | 
			
		||||
  namespace QCD {
 | 
			
		||||
    
 | 
			
		||||
    template<class Impl>
 | 
			
		||||
      class WilsonTMFermion5D : public WilsonFermion5D<Impl>
 | 
			
		||||
      {
 | 
			
		||||
      public:
 | 
			
		||||
	INHERIT_IMPL_TYPES(Impl);
 | 
			
		||||
      public:
 | 
			
		||||
 | 
			
		||||
	virtual void   Instantiatable(void) {};
 | 
			
		||||
 | 
			
		||||
	// Constructors
 | 
			
		||||
        WilsonTMFermion5D(GaugeField &_Umu,
 | 
			
		||||
			  GridCartesian         &Fgrid,
 | 
			
		||||
			  GridRedBlackCartesian &Frbgrid, 
 | 
			
		||||
			  GridCartesian         &Ugrid,
 | 
			
		||||
			  GridRedBlackCartesian &Urbgrid, 
 | 
			
		||||
			  const std::vector<RealD> _mass,
 | 
			
		||||
			  const std::vector<RealD> _mu,
 | 
			
		||||
			  const ImplParams &p= ImplParams()
 | 
			
		||||
			  ) :
 | 
			
		||||
	WilsonFermion5D<Impl>(_Umu,
 | 
			
		||||
			      Fgrid,
 | 
			
		||||
			      Frbgrid,
 | 
			
		||||
			      Ugrid,
 | 
			
		||||
			      Urbgrid,
 | 
			
		||||
			      4.0,p)
 | 
			
		||||
	
 | 
			
		||||
	  {
 | 
			
		||||
	    update(_mass,_mu);
 | 
			
		||||
	  }
 | 
			
		||||
 | 
			
		||||
	virtual void Meooe(const FermionField &in, FermionField &out) {
 | 
			
		||||
	  if (in.checkerboard == Odd) {
 | 
			
		||||
	    this->DhopEO(in, out, DaggerNo);
 | 
			
		||||
	  } else {
 | 
			
		||||
	    this->DhopOE(in, out, DaggerNo);
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	virtual void MeooeDag(const FermionField &in, FermionField &out) {
 | 
			
		||||
	  if (in.checkerboard == Odd) {
 | 
			
		||||
	    this->DhopEO(in, out, DaggerYes);
 | 
			
		||||
	  } else {
 | 
			
		||||
	    this->DhopOE(in, out, DaggerYes);
 | 
			
		||||
	  }
 | 
			
		||||
	}	
 | 
			
		||||
	
 | 
			
		||||
	// allow override for twisted mass and clover
 | 
			
		||||
	virtual void Mooee(const FermionField &in, FermionField &out) {
 | 
			
		||||
	  out.checkerboard = in.checkerboard;
 | 
			
		||||
	  //axpibg5x(out,in,a,b); // out = a*in + b*i*G5*in
 | 
			
		||||
	  for (int s=0;s<(int)this->mass.size();s++) {
 | 
			
		||||
	    ComplexD a = 4.0+this->mass[s];
 | 
			
		||||
	    ComplexD b(0.0,this->mu[s]);
 | 
			
		||||
	    axpbg5y_ssp(out,a,in,b,in,s,s);
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	virtual void MooeeDag(const FermionField &in, FermionField &out) {
 | 
			
		||||
	  out.checkerboard = in.checkerboard;
 | 
			
		||||
	  for (int s=0;s<(int)this->mass.size();s++) {
 | 
			
		||||
	    ComplexD a = 4.0+this->mass[s];
 | 
			
		||||
	    ComplexD b(0.0,-this->mu[s]);
 | 
			
		||||
	    axpbg5y_ssp(out,a,in,b,in,s,s);
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
	virtual void MooeeInv(const FermionField &in, FermionField &out) {
 | 
			
		||||
	  for (int s=0;s<(int)this->mass.size();s++) {
 | 
			
		||||
	    RealD m    = this->mass[s];
 | 
			
		||||
	    RealD tm   = this->mu[s];
 | 
			
		||||
	    RealD mtil = 4.0+this->mass[s];
 | 
			
		||||
	    RealD sq   = mtil*mtil+tm*tm;
 | 
			
		||||
	    ComplexD a    = mtil/sq;
 | 
			
		||||
	    ComplexD b(0.0, -tm /sq);
 | 
			
		||||
	    axpbg5y_ssp(out,a,in,b,in,s,s);
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
	virtual void MooeeInvDag(const FermionField &in, FermionField &out) {
 | 
			
		||||
	  for (int s=0;s<(int)this->mass.size();s++) {
 | 
			
		||||
	    RealD m    = this->mass[s];
 | 
			
		||||
	    RealD tm   = this->mu[s];
 | 
			
		||||
	    RealD mtil = 4.0+this->mass[s];
 | 
			
		||||
	    RealD sq   = mtil*mtil+tm*tm;
 | 
			
		||||
	    ComplexD a    = mtil/sq;
 | 
			
		||||
	    ComplexD b(0.0,tm /sq);
 | 
			
		||||
	    axpbg5y_ssp(out,a,in,b,in,s,s);
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	virtual RealD M(const FermionField &in, FermionField &out) {
 | 
			
		||||
	  out.checkerboard = in.checkerboard;
 | 
			
		||||
	  this->Dhop(in, out, DaggerNo);
 | 
			
		||||
	  FermionField tmp(out._grid);
 | 
			
		||||
	  for (int s=0;s<(int)this->mass.size();s++) {
 | 
			
		||||
	    ComplexD a = 4.0+this->mass[s];
 | 
			
		||||
	    ComplexD b(0.0,this->mu[s]);
 | 
			
		||||
	    axpbg5y_ssp(tmp,a,in,b,in,s,s);
 | 
			
		||||
	  }
 | 
			
		||||
	  return axpy_norm(out, 1.0, tmp, out);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// needed for fast PV
 | 
			
		||||
	void update(const std::vector<RealD>& _mass, const std::vector<RealD>& _mu) {
 | 
			
		||||
	  assert(_mass.size() == _mu.size());
 | 
			
		||||
	  assert(_mass.size() == this->FermionGrid()->_fdimensions[0]);
 | 
			
		||||
	  this->mass = _mass;
 | 
			
		||||
	  this->mu = _mu;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
      private:
 | 
			
		||||
	std::vector<RealD> mu;
 | 
			
		||||
	std::vector<RealD> mass;
 | 
			
		||||
	
 | 
			
		||||
      };
 | 
			
		||||
   
 | 
			
		||||
    typedef WilsonTMFermion5D<WilsonImplF> WilsonTMFermion5DF; 
 | 
			
		||||
    typedef WilsonTMFermion5D<WilsonImplD> WilsonTMFermion5DD; 
 | 
			
		||||
 | 
			
		||||
}}
 | 
			
		||||
@@ -1,84 +0,0 @@
 | 
			
		||||
   /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/util/Sha.h
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2018
 | 
			
		||||
 | 
			
		||||
    Author: Peter Boyle
 | 
			
		||||
 | 
			
		||||
    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 */
 | 
			
		||||
extern "C" {
 | 
			
		||||
#include <openssl/sha.h>
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
class GridChecksum
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  static inline uint32_t crc32(void *data,size_t bytes)
 | 
			
		||||
  {
 | 
			
		||||
    return ::crc32(0L,(unsigned char *)data,bytes);
 | 
			
		||||
  }
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  static inline std::string sha256_string(const std::vector<T> &hash)
 | 
			
		||||
  {
 | 
			
		||||
    std::stringstream sha;
 | 
			
		||||
    std::string       s;
 | 
			
		||||
 | 
			
		||||
    for(unsigned int i = 0; i < hash.size(); i++) 
 | 
			
		||||
    { 
 | 
			
		||||
        sha << std::hex << static_cast<unsigned int>(hash[i]);
 | 
			
		||||
    }
 | 
			
		||||
    s = sha.str();
 | 
			
		||||
 | 
			
		||||
    return s;
 | 
			
		||||
  }
 | 
			
		||||
  static inline std::vector<unsigned char> sha256(const void *data,size_t bytes)
 | 
			
		||||
  {
 | 
			
		||||
    std::vector<unsigned char> hash(SHA256_DIGEST_LENGTH);
 | 
			
		||||
    SHA256_CTX sha256;
 | 
			
		||||
    SHA256_Init  (&sha256);
 | 
			
		||||
    SHA256_Update(&sha256, data,bytes);
 | 
			
		||||
    SHA256_Final (&hash[0], &sha256);
 | 
			
		||||
    return hash;
 | 
			
		||||
  }
 | 
			
		||||
  static inline std::vector<int> sha256_seeds(const std::string &s)
 | 
			
		||||
  {
 | 
			
		||||
    std::vector<int> seeds;
 | 
			
		||||
    std::vector<unsigned char> uchars = sha256((void *)s.c_str(),s.size());
 | 
			
		||||
    for(int i=0;i<uchars.size();i++) seeds.push_back(uchars[i]);
 | 
			
		||||
    return seeds;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
int main(int argc,char **argv)
 | 
			
		||||
{
 | 
			
		||||
  std::string s("The quick brown fox jumps over the lazy dog");
 | 
			
		||||
  auto csum = GridChecksum::sha256_seeds(s);
 | 
			
		||||
  std::cout << "SHA256 sum is 0x";
 | 
			
		||||
  for(int i=0;i<csum.size;i++) { 
 | 
			
		||||
    std::cout << std::hex << csum[i];
 | 
			
		||||
  }
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
@@ -1,405 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/A2AMatrix.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
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 A2A_Matrix_hpp_
 | 
			
		||||
#define A2A_Matrix_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/TimerArray.hpp>
 | 
			
		||||
#include <Grid/Eigen/unsupported/CXX11/Tensor>
 | 
			
		||||
 | 
			
		||||
#ifndef HADRONS_A2AM_NAME 
 | 
			
		||||
#define HADRONS_A2AM_NAME "a2aMatrix"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HADRONS_A2AM_PARALLEL_IO
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
// general A2A matrix set based on Eigen tensors and Grid-allocated memory
 | 
			
		||||
// Dimensions:
 | 
			
		||||
//   0 - ext - external field (momentum, EM field, ...)
 | 
			
		||||
//   1 - str - spin-color structure
 | 
			
		||||
//   2 - t   - timeslice
 | 
			
		||||
//   3 - i   - left  A2A mode index
 | 
			
		||||
//   4 - j   - right A2A mode index
 | 
			
		||||
template <typename T>
 | 
			
		||||
using A2AMatrixSet = Eigen::TensorMap<Eigen::Tensor<T, 5, Eigen::RowMajor>>;
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                      Abstract class for A2A kernels                        *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename T, typename Field>
 | 
			
		||||
class A2AKernel
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    A2AKernel(void) = default;
 | 
			
		||||
    virtual ~A2AKernel(void) = default;
 | 
			
		||||
    virtual void operator()(A2AMatrixSet<T> &m, const Field *left, const Field *right,
 | 
			
		||||
                          const unsigned int orthogDim, double &time) = 0;
 | 
			
		||||
    virtual double flops(const unsigned int blockSizei, const unsigned int blockSizej) = 0;
 | 
			
		||||
    virtual double bytes(const unsigned int blockSizei, const unsigned int blockSizej) = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                  Class to handle A2A matrix block HDF5 I/O                 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename T>
 | 
			
		||||
class A2AMatrixIo
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    // constructors
 | 
			
		||||
    A2AMatrixIo(void) = default;
 | 
			
		||||
    A2AMatrixIo(std::string filename, std::string dataname, 
 | 
			
		||||
                const unsigned int nt, const unsigned int ni,
 | 
			
		||||
                const unsigned int nj);
 | 
			
		||||
    // destructor
 | 
			
		||||
    ~A2AMatrixIo(void) = default;
 | 
			
		||||
    // file allocation
 | 
			
		||||
    template <typename MetadataType>
 | 
			
		||||
    void initFile(const MetadataType &d, const unsigned int chunkSize);
 | 
			
		||||
    // block I/O
 | 
			
		||||
    void saveBlock(const T *data, const unsigned int i, const unsigned int j,
 | 
			
		||||
                   const unsigned int blockSizei, const unsigned int blockSizej);
 | 
			
		||||
    void saveBlock(const A2AMatrixSet<T> &m, const unsigned int ext, const unsigned int str,
 | 
			
		||||
                   const unsigned int i, const unsigned int j);
 | 
			
		||||
private:
 | 
			
		||||
    std::string  filename_, dataname_;
 | 
			
		||||
    unsigned int nt_, ni_, nj_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                  Wrapper for A2A matrix block computation                  *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename T, typename Field, typename MetadataType, typename TIo = T>
 | 
			
		||||
class A2AMatrixBlockComputation
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
    struct IoHelper
 | 
			
		||||
    {
 | 
			
		||||
        A2AMatrixIo<TIo> io;
 | 
			
		||||
        MetadataType     md;
 | 
			
		||||
        unsigned int     e, s, i, j;
 | 
			
		||||
    };
 | 
			
		||||
    typedef std::function<std::string(const unsigned int, const unsigned int)>  FilenameFn;
 | 
			
		||||
    typedef std::function<MetadataType(const unsigned int, const unsigned int)> MetadataFn;
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    A2AMatrixBlockComputation(GridBase *grid,
 | 
			
		||||
                              const unsigned int orthogDim,
 | 
			
		||||
                              const unsigned int next,
 | 
			
		||||
                              const unsigned int nstr,
 | 
			
		||||
                              const unsigned int blockSize,
 | 
			
		||||
                              const unsigned int cacheBlockSize,
 | 
			
		||||
                              TimerArray *tArray = nullptr);
 | 
			
		||||
    // execution
 | 
			
		||||
    void execute(const std::vector<Field> &left, 
 | 
			
		||||
                 const std::vector<Field> &right,
 | 
			
		||||
                 A2AKernel<T, Field> &kernel,
 | 
			
		||||
                 const FilenameFn &ionameFn,
 | 
			
		||||
                 const FilenameFn &filenameFn,
 | 
			
		||||
                 const MetadataFn &metadataFn);
 | 
			
		||||
private:
 | 
			
		||||
    // I/O handler
 | 
			
		||||
    void saveBlock(const A2AMatrixSet<TIo> &m, IoHelper &h);
 | 
			
		||||
private:
 | 
			
		||||
    TimerArray            *tArray_;
 | 
			
		||||
    GridBase              *grid_;
 | 
			
		||||
    unsigned int          orthogDim_, nt_, next_, nstr_, blockSize_, cacheBlockSize_;
 | 
			
		||||
    Vector<T>             mCache_;
 | 
			
		||||
    Vector<TIo>           mBuf_;
 | 
			
		||||
    std::vector<IoHelper> nodeIo_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                     A2AMatrixIo template implementation                    *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename T>
 | 
			
		||||
A2AMatrixIo<T>::A2AMatrixIo(std::string filename, std::string dataname, 
 | 
			
		||||
                            const unsigned int nt, const unsigned int ni,
 | 
			
		||||
                            const unsigned int nj)
 | 
			
		||||
: filename_(filename), dataname_(dataname)
 | 
			
		||||
, nt_(nt), ni_(ni), nj_(nj)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// file allocation /////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename T>
 | 
			
		||||
template <typename MetadataType>
 | 
			
		||||
void A2AMatrixIo<T>::initFile(const MetadataType &d, const unsigned int chunkSize)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_HDF5
 | 
			
		||||
    std::vector<hsize_t>    dim = {static_cast<hsize_t>(nt_), 
 | 
			
		||||
                                   static_cast<hsize_t>(ni_), 
 | 
			
		||||
                                   static_cast<hsize_t>(nj_)},
 | 
			
		||||
                            chunk = {static_cast<hsize_t>(nt_), 
 | 
			
		||||
                                     static_cast<hsize_t>(chunkSize), 
 | 
			
		||||
                                     static_cast<hsize_t>(chunkSize)};
 | 
			
		||||
    H5NS::DataSpace         dataspace(dim.size(), dim.data());
 | 
			
		||||
    H5NS::DataSet           dataset;
 | 
			
		||||
    H5NS::DSetCreatPropList plist;
 | 
			
		||||
    
 | 
			
		||||
    // create empty file just with metadata
 | 
			
		||||
    {
 | 
			
		||||
        Hdf5Writer writer(filename_);
 | 
			
		||||
        write(writer, dataname_, d);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // create the dataset
 | 
			
		||||
    Hdf5Reader reader(filename_);
 | 
			
		||||
 | 
			
		||||
    push(reader, dataname_);
 | 
			
		||||
    auto &group = reader.getGroup();
 | 
			
		||||
    plist.setChunk(chunk.size(), chunk.data());
 | 
			
		||||
    dataset = group.createDataSet(HADRONS_A2AM_NAME, Hdf5Type<T>::type(), dataspace, plist);
 | 
			
		||||
#else
 | 
			
		||||
    HADRONS_ERROR(Implementation, "all-to-all matrix I/O needs HDF5 library");
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// block I/O ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename T>
 | 
			
		||||
void A2AMatrixIo<T>::saveBlock(const T *data, 
 | 
			
		||||
                               const unsigned int i, 
 | 
			
		||||
                               const unsigned int j,
 | 
			
		||||
                               const unsigned int blockSizei,
 | 
			
		||||
                               const unsigned int blockSizej)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_HDF5
 | 
			
		||||
    Hdf5Reader           reader(filename_);
 | 
			
		||||
    std::vector<hsize_t> count = {nt_, blockSizei, blockSizej},
 | 
			
		||||
                         offset = {0, static_cast<hsize_t>(i),
 | 
			
		||||
                                   static_cast<hsize_t>(j)},
 | 
			
		||||
                         stride = {1, 1, 1},
 | 
			
		||||
                         block  = {1, 1, 1}; 
 | 
			
		||||
    H5NS::DataSpace      memspace(count.size(), count.data()), dataspace;
 | 
			
		||||
    H5NS::DataSet        dataset;
 | 
			
		||||
    size_t               shift;
 | 
			
		||||
 | 
			
		||||
    push(reader, dataname_);
 | 
			
		||||
    auto &group = reader.getGroup();
 | 
			
		||||
    dataset     = group.openDataSet(HADRONS_A2AM_NAME);
 | 
			
		||||
    dataspace   = dataset.getSpace();
 | 
			
		||||
    dataspace.selectHyperslab(H5S_SELECT_SET, count.data(), offset.data(),
 | 
			
		||||
                              stride.data(), block.data());
 | 
			
		||||
    dataset.write(data, Hdf5Type<T>::type(), memspace, dataspace);
 | 
			
		||||
#else
 | 
			
		||||
    HADRONS_ERROR(Implementation, "all-to-all matrix I/O needs HDF5 library");
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
void A2AMatrixIo<T>::saveBlock(const A2AMatrixSet<T> &m,
 | 
			
		||||
                               const unsigned int ext, const unsigned int str,
 | 
			
		||||
                               const unsigned int i, const unsigned int j)
 | 
			
		||||
{
 | 
			
		||||
    unsigned int blockSizei = m.dimension(3);
 | 
			
		||||
    unsigned int blockSizej = m.dimension(4);
 | 
			
		||||
    unsigned int nstr       = m.dimension(1);
 | 
			
		||||
    size_t       offset     = (ext*nstr + str)*nt_*blockSizei*blockSizej;
 | 
			
		||||
 | 
			
		||||
    saveBlock(m.data() + offset, i, j, blockSizei, blockSizej);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *               A2AMatrixBlockComputation template implementation            *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename T, typename Field, typename MetadataType, typename TIo>
 | 
			
		||||
A2AMatrixBlockComputation<T, Field, MetadataType, TIo>
 | 
			
		||||
::A2AMatrixBlockComputation(GridBase *grid,
 | 
			
		||||
                            const unsigned int orthogDim,
 | 
			
		||||
                            const unsigned int next, 
 | 
			
		||||
                            const unsigned int nstr,
 | 
			
		||||
                            const unsigned int blockSize, 
 | 
			
		||||
                            const unsigned int cacheBlockSize,
 | 
			
		||||
                            TimerArray *tArray)
 | 
			
		||||
: grid_(grid), nt_(grid->GlobalDimensions()[orthogDim]), orthogDim_(orthogDim)
 | 
			
		||||
, next_(next), nstr_(nstr), blockSize_(blockSize), cacheBlockSize_(cacheBlockSize)
 | 
			
		||||
, tArray_(tArray)
 | 
			
		||||
{
 | 
			
		||||
    mCache_.resize(nt_*next_*nstr_*cacheBlockSize_*cacheBlockSize_);
 | 
			
		||||
    mBuf_.resize(nt_*next_*nstr_*blockSize_*blockSize_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define START_TIMER(name) if (tArray_) tArray_->startTimer(name)
 | 
			
		||||
#define STOP_TIMER(name)  if (tArray_) tArray_->stopTimer(name)
 | 
			
		||||
#define GET_TIMER(name)   ((tArray_ != nullptr) ? tArray_->getDTimer(name) : 0.)
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename T, typename Field, typename MetadataType, typename TIo>
 | 
			
		||||
void A2AMatrixBlockComputation<T, Field, MetadataType, TIo>
 | 
			
		||||
::execute(const std::vector<Field> &left, const std::vector<Field> &right,
 | 
			
		||||
          A2AKernel<T, Field> &kernel, const FilenameFn &ionameFn,
 | 
			
		||||
          const FilenameFn &filenameFn, const MetadataFn &metadataFn)
 | 
			
		||||
{
 | 
			
		||||
    //////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    // i,j   is first  loop over blockSize_ factors
 | 
			
		||||
    // ii,jj is second loop over cacheBlockSize_ factors for high perf contractions
 | 
			
		||||
    // iii,jjj are loops within cacheBlock
 | 
			
		||||
    // Total index is sum of these  i+ii+iii etc...
 | 
			
		||||
    //////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    int    N_i = left.size();
 | 
			
		||||
    int    N_j = right.size();
 | 
			
		||||
    double flops, bytes, t_kernel;
 | 
			
		||||
    double nodes = grid_->NodeCount();
 | 
			
		||||
    
 | 
			
		||||
    int NBlock_i = N_i/blockSize_ + (((N_i % blockSize_) != 0) ? 1 : 0);
 | 
			
		||||
    int NBlock_j = N_j/blockSize_ + (((N_j % blockSize_) != 0) ? 1 : 0);
 | 
			
		||||
 | 
			
		||||
    for(int i=0;i<N_i;i+=blockSize_)
 | 
			
		||||
    for(int j=0;j<N_j;j+=blockSize_)
 | 
			
		||||
    {
 | 
			
		||||
        // Get the W and V vectors for this block^2 set of terms
 | 
			
		||||
        int N_ii = MIN(N_i-i,blockSize_);
 | 
			
		||||
        int N_jj = MIN(N_j-j,blockSize_);
 | 
			
		||||
        A2AMatrixSet<TIo> mBlock(mBuf_.data(), next_, nstr_, nt_, N_ii, N_jj);
 | 
			
		||||
 | 
			
		||||
        LOG(Message) << "All-to-all matrix block " 
 | 
			
		||||
                     << j/blockSize_ + NBlock_j*i/blockSize_ + 1 
 | 
			
		||||
                     << "/" << NBlock_i*NBlock_j << " [" << i <<" .. " 
 | 
			
		||||
                     << i+N_ii-1 << ", " << j <<" .. " << j+N_jj-1 << "]" 
 | 
			
		||||
                     << std::endl;
 | 
			
		||||
        // Series of cache blocked chunks of the contractions within this block
 | 
			
		||||
        flops    = 0.0;
 | 
			
		||||
        bytes    = 0.0;
 | 
			
		||||
        t_kernel = 0.0;
 | 
			
		||||
        for(int ii=0;ii<N_ii;ii+=cacheBlockSize_)
 | 
			
		||||
        for(int jj=0;jj<N_jj;jj+=cacheBlockSize_)
 | 
			
		||||
        {
 | 
			
		||||
            double t;
 | 
			
		||||
            int N_iii = MIN(N_ii-ii,cacheBlockSize_);
 | 
			
		||||
            int N_jjj = MIN(N_jj-jj,cacheBlockSize_);
 | 
			
		||||
            A2AMatrixSet<T> mCacheBlock(mCache_.data(), next_, nstr_, nt_, N_iii, N_jjj);
 | 
			
		||||
 | 
			
		||||
            START_TIMER("kernel");
 | 
			
		||||
            kernel(mCacheBlock, &left[i+ii], &right[j+jj], orthogDim_, t);
 | 
			
		||||
            STOP_TIMER("kernel");
 | 
			
		||||
            t_kernel += t;
 | 
			
		||||
            flops    += kernel.flops(N_iii, N_jjj);
 | 
			
		||||
            bytes    += kernel.bytes(N_iii, N_jjj);
 | 
			
		||||
 | 
			
		||||
            START_TIMER("cache copy");
 | 
			
		||||
            parallel_for_nest5(int e =0;e<next_;e++)
 | 
			
		||||
            for(int s =0;s< nstr_;s++)
 | 
			
		||||
            for(int t =0;t< nt_;t++)
 | 
			
		||||
            for(int iii=0;iii< N_iii;iii++)
 | 
			
		||||
            for(int jjj=0;jjj< N_jjj;jjj++)
 | 
			
		||||
            {
 | 
			
		||||
                mBlock(e,s,t,ii+iii,jj+jjj) = mCacheBlock(e,s,t,iii,jjj);
 | 
			
		||||
            }
 | 
			
		||||
            STOP_TIMER("cache copy");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // perf
 | 
			
		||||
        LOG(Message) << "Kernel perf " << flops/t_kernel/1.0e3/nodes 
 | 
			
		||||
                     << " Gflop/s/node " << std::endl;
 | 
			
		||||
        LOG(Message) << "Kernel perf " << bytes/t_kernel*1.0e6/1024/1024/1024/nodes 
 | 
			
		||||
                     << " GB/s/node "  << std::endl;
 | 
			
		||||
 | 
			
		||||
        // IO
 | 
			
		||||
        double       blockSize, ioTime;
 | 
			
		||||
        unsigned int myRank = grid_->ThisRank(), nRank  = grid_->RankCount();
 | 
			
		||||
    
 | 
			
		||||
        LOG(Message) << "Writing block to disk" << std::endl;
 | 
			
		||||
        ioTime = -GET_TIMER("IO: write block");
 | 
			
		||||
        START_TIMER("IO: total");
 | 
			
		||||
        makeFileDir(filenameFn(0, 0), grid_);
 | 
			
		||||
#ifdef HADRONS_A2AM_PARALLEL_IO
 | 
			
		||||
        grid_->Barrier();
 | 
			
		||||
        // make task list for current node
 | 
			
		||||
        nodeIo_.clear();
 | 
			
		||||
        for(int f = myRank; f < next_*nstr_; f += nRank)
 | 
			
		||||
        {
 | 
			
		||||
            IoHelper h;
 | 
			
		||||
 | 
			
		||||
            h.i  = i;
 | 
			
		||||
            h.j  = j;
 | 
			
		||||
            h.e  = f/nstr_;
 | 
			
		||||
            h.s  = f % nstr_;
 | 
			
		||||
            h.io = A2AMatrixIo<TIo>(filenameFn(h.e, h.s), 
 | 
			
		||||
                                    ionameFn(h.e, h.s), nt_, N_i, N_j);
 | 
			
		||||
            h.md = metadataFn(h.e, h.s);
 | 
			
		||||
            nodeIo_.push_back(h);
 | 
			
		||||
        }
 | 
			
		||||
        // parallel IO
 | 
			
		||||
        for (auto &h: nodeIo_)
 | 
			
		||||
        {
 | 
			
		||||
            saveBlock(mBlock, h);
 | 
			
		||||
        }
 | 
			
		||||
        grid_->Barrier();
 | 
			
		||||
#else
 | 
			
		||||
        // serial IO, for testing purposes only
 | 
			
		||||
        for(int e = 0; e < next_; e++)
 | 
			
		||||
        for(int s = 0; s < nstr_; s++)
 | 
			
		||||
        {
 | 
			
		||||
            IoHelper h;
 | 
			
		||||
 | 
			
		||||
            h.i  = i;
 | 
			
		||||
            h.j  = j;
 | 
			
		||||
            h.e  = e;
 | 
			
		||||
            h.s  = s;
 | 
			
		||||
            h.io = A2AMatrixIo<TIo>(filenameFn(h.e, h.s), 
 | 
			
		||||
                                    ionameFn(h.e, h.s), nt_, N_i, N_j);
 | 
			
		||||
            h.md = metadataFn(h.e, h.s);
 | 
			
		||||
            saveBlock(mfBlock, h);
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
        STOP_TIMER("IO: total");
 | 
			
		||||
        blockSize  = static_cast<double>(next_*nstr_*nt_*N_ii*N_jj*sizeof(TIo));
 | 
			
		||||
        ioTime    += GET_TIMER("IO: write block");
 | 
			
		||||
        LOG(Message) << "HDF5 IO done " << sizeString(blockSize) << " in "
 | 
			
		||||
                     << ioTime  << " us (" 
 | 
			
		||||
                     << blockSize/ioTime*1.0e6/1024/1024
 | 
			
		||||
                     << " MB/s)" << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// I/O handler /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename T, typename Field, typename MetadataType, typename TIo>
 | 
			
		||||
void A2AMatrixBlockComputation<T, Field, MetadataType, TIo>
 | 
			
		||||
::saveBlock(const A2AMatrixSet<TIo> &m, IoHelper &h)
 | 
			
		||||
{
 | 
			
		||||
    if ((h.i == 0) and (h.j == 0))
 | 
			
		||||
    {
 | 
			
		||||
        START_TIMER("IO: file creation");
 | 
			
		||||
        h.io.initFile(h.md, blockSize_);
 | 
			
		||||
        STOP_TIMER("IO: file creation");
 | 
			
		||||
    }
 | 
			
		||||
    START_TIMER("IO: write block");
 | 
			
		||||
    h.io.saveBlock(m, h.e, h.s, h.i, h.j);
 | 
			
		||||
    STOP_TIMER("IO: write block");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef START_TIMER
 | 
			
		||||
#undef STOP_TIMER
 | 
			
		||||
#undef GET_TIMER
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // A2A_Matrix_hpp_
 | 
			
		||||
@@ -1,342 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/A2AVectors.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
Author: fionnoh <fionnoh@gmail.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 A2A_Vectors_hpp_
 | 
			
		||||
#define A2A_Vectors_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Environment.hpp>
 | 
			
		||||
#include <Hadrons/Solver.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                 Class to generate V & W all-to-all vectors                 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class A2AVectorsSchurDiagTwo
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
    SOLVER_TYPE_ALIASES(FImpl,);
 | 
			
		||||
public:
 | 
			
		||||
    A2AVectorsSchurDiagTwo(FMat &action, Solver &solver);
 | 
			
		||||
    virtual ~A2AVectorsSchurDiagTwo(void) = default;
 | 
			
		||||
    void makeLowModeV(FermionField &vout, 
 | 
			
		||||
                      const FermionField &evec, const Real &eval);
 | 
			
		||||
    void makeLowModeV5D(FermionField &vout_4d, FermionField &vout_5d, 
 | 
			
		||||
                        const FermionField &evec, const Real &eval);
 | 
			
		||||
    void makeLowModeW(FermionField &wout, 
 | 
			
		||||
                      const FermionField &evec, const Real &eval);
 | 
			
		||||
    void makeLowModeW5D(FermionField &wout_4d, FermionField &wout_5d, 
 | 
			
		||||
                        const FermionField &evec, const Real &eval);
 | 
			
		||||
    void makeHighModeV(FermionField &vout, const FermionField &noise);
 | 
			
		||||
    void makeHighModeV5D(FermionField &vout_4d, FermionField &vout_5d, 
 | 
			
		||||
                         const FermionField &noise_5d);
 | 
			
		||||
    void makeHighModeW(FermionField &wout, const FermionField &noise);
 | 
			
		||||
    void makeHighModeW5D(FermionField &vout_5d, FermionField &wout_5d, 
 | 
			
		||||
                         const FermionField &noise_5d);
 | 
			
		||||
private:
 | 
			
		||||
    FMat                                     &action_;
 | 
			
		||||
    Solver                                   &solver_;
 | 
			
		||||
    GridBase                                 *fGrid_, *frbGrid_, *gGrid_;
 | 
			
		||||
    bool                                     is5d_;
 | 
			
		||||
    FermionField                             src_o_, sol_e_, sol_o_, tmp_, tmp5_;
 | 
			
		||||
    SchurDiagTwoOperator<FMat, FermionField> op_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                  Methods for V & W all-to-all vectors I/O                  *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
class A2AVectorsIo
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    struct Record: Serializable
 | 
			
		||||
    {
 | 
			
		||||
        GRID_SERIALIZABLE_CLASS_MEMBERS(Record,
 | 
			
		||||
                                        unsigned int, index);
 | 
			
		||||
        Record(void): index(0) {}
 | 
			
		||||
    };
 | 
			
		||||
public:
 | 
			
		||||
    template <typename Field>
 | 
			
		||||
    static void write(const std::string fileStem, std::vector<Field> &vec, 
 | 
			
		||||
                      const bool multiFile, const int trajectory = -1);
 | 
			
		||||
    template <typename Field>
 | 
			
		||||
    static void read(std::vector<Field> &vec, const std::string fileStem,
 | 
			
		||||
                     const bool multiFile, const int trajectory = -1);
 | 
			
		||||
private:
 | 
			
		||||
    static inline std::string vecFilename(const std::string stem, const int traj, 
 | 
			
		||||
                                          const bool multiFile)
 | 
			
		||||
    {
 | 
			
		||||
        std::string t = (traj < 0) ? "" : ("." + std::to_string(traj));
 | 
			
		||||
 | 
			
		||||
        if (multiFile)
 | 
			
		||||
        {
 | 
			
		||||
            return stem + t;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            return stem + t + ".bin";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *               A2AVectorsSchurDiagTwo template implementation               *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
A2AVectorsSchurDiagTwo<FImpl>::A2AVectorsSchurDiagTwo(FMat &action, Solver &solver)
 | 
			
		||||
: action_(action)
 | 
			
		||||
, solver_(solver)
 | 
			
		||||
, fGrid_(action_.FermionGrid())
 | 
			
		||||
, frbGrid_(action_.FermionRedBlackGrid())
 | 
			
		||||
, gGrid_(action_.GaugeGrid())
 | 
			
		||||
, src_o_(frbGrid_)
 | 
			
		||||
, sol_e_(frbGrid_)
 | 
			
		||||
, sol_o_(frbGrid_)
 | 
			
		||||
, tmp_(frbGrid_)
 | 
			
		||||
, tmp5_(fGrid_)
 | 
			
		||||
, op_(action_)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void A2AVectorsSchurDiagTwo<FImpl>::makeLowModeV(FermionField &vout, const FermionField &evec, const Real &eval)
 | 
			
		||||
{
 | 
			
		||||
    src_o_ = evec;
 | 
			
		||||
    src_o_.checkerboard = Odd;
 | 
			
		||||
    pickCheckerboard(Even, sol_e_, vout);
 | 
			
		||||
    pickCheckerboard(Odd, sol_o_, vout);
 | 
			
		||||
 | 
			
		||||
    /////////////////////////////////////////////////////
 | 
			
		||||
    // v_ie = -(1/eval_i) * MeeInv Meo MooInv evec_i
 | 
			
		||||
    /////////////////////////////////////////////////////
 | 
			
		||||
    action_.MooeeInv(src_o_, tmp_);
 | 
			
		||||
    assert(tmp_.checkerboard == Odd);
 | 
			
		||||
    action_.Meooe(tmp_, sol_e_);
 | 
			
		||||
    assert(sol_e_.checkerboard == Even);
 | 
			
		||||
    action_.MooeeInv(sol_e_, tmp_);
 | 
			
		||||
    assert(tmp_.checkerboard == Even);
 | 
			
		||||
    sol_e_ = (-1.0 / eval) * tmp_;
 | 
			
		||||
    assert(sol_e_.checkerboard == Even);
 | 
			
		||||
 | 
			
		||||
    /////////////////////////////////////////////////////
 | 
			
		||||
    // v_io = (1/eval_i) * MooInv evec_i
 | 
			
		||||
    /////////////////////////////////////////////////////
 | 
			
		||||
    action_.MooeeInv(src_o_, tmp_);
 | 
			
		||||
    assert(tmp_.checkerboard == Odd);
 | 
			
		||||
    sol_o_ = (1.0 / eval) * tmp_;
 | 
			
		||||
    assert(sol_o_.checkerboard == Odd);
 | 
			
		||||
    setCheckerboard(vout, sol_e_);
 | 
			
		||||
    assert(sol_e_.checkerboard == Even);
 | 
			
		||||
    setCheckerboard(vout, sol_o_);
 | 
			
		||||
    assert(sol_o_.checkerboard == Odd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void A2AVectorsSchurDiagTwo<FImpl>::makeLowModeV5D(FermionField &vout_4d, FermionField &vout_5d, const FermionField &evec, const Real &eval)
 | 
			
		||||
{
 | 
			
		||||
    makeLowModeV(vout_5d, evec, eval);
 | 
			
		||||
    action_.ExportPhysicalFermionSolution(vout_5d, vout_4d);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void A2AVectorsSchurDiagTwo<FImpl>::makeLowModeW(FermionField &wout, const FermionField &evec, const Real &eval)
 | 
			
		||||
{
 | 
			
		||||
    src_o_ = evec;
 | 
			
		||||
    src_o_.checkerboard = Odd;
 | 
			
		||||
    pickCheckerboard(Even, sol_e_, wout);
 | 
			
		||||
    pickCheckerboard(Odd, sol_o_, wout);
 | 
			
		||||
 | 
			
		||||
    /////////////////////////////////////////////////////
 | 
			
		||||
    // w_ie = - MeeInvDag MoeDag Doo evec_i
 | 
			
		||||
    /////////////////////////////////////////////////////
 | 
			
		||||
    op_.Mpc(src_o_, tmp_);
 | 
			
		||||
    assert(tmp_.checkerboard == Odd);
 | 
			
		||||
    action_.MeooeDag(tmp_, sol_e_);
 | 
			
		||||
    assert(sol_e_.checkerboard == Even);
 | 
			
		||||
    action_.MooeeInvDag(sol_e_, tmp_);
 | 
			
		||||
    assert(tmp_.checkerboard == Even);
 | 
			
		||||
    sol_e_ = (-1.0) * tmp_;
 | 
			
		||||
 | 
			
		||||
    /////////////////////////////////////////////////////
 | 
			
		||||
    // w_io = Doo evec_i
 | 
			
		||||
    /////////////////////////////////////////////////////
 | 
			
		||||
    op_.Mpc(src_o_, sol_o_);
 | 
			
		||||
    assert(sol_o_.checkerboard == Odd);
 | 
			
		||||
    setCheckerboard(wout, sol_e_);
 | 
			
		||||
    assert(sol_e_.checkerboard == Even);
 | 
			
		||||
    setCheckerboard(wout, sol_o_);
 | 
			
		||||
    assert(sol_o_.checkerboard == Odd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void A2AVectorsSchurDiagTwo<FImpl>::makeLowModeW5D(FermionField &wout_4d, 
 | 
			
		||||
                                                   FermionField &wout_5d, 
 | 
			
		||||
                                                   const FermionField &evec, 
 | 
			
		||||
                                                   const Real &eval)
 | 
			
		||||
{
 | 
			
		||||
    makeLowModeW(tmp5_, evec, eval);
 | 
			
		||||
    action_.DminusDag(tmp5_, wout_5d);
 | 
			
		||||
    action_.ExportPhysicalFermionSource(wout_5d, wout_4d);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void A2AVectorsSchurDiagTwo<FImpl>::makeHighModeV(FermionField &vout, 
 | 
			
		||||
                                                  const FermionField &noise)
 | 
			
		||||
{
 | 
			
		||||
    solver_(vout, noise);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void A2AVectorsSchurDiagTwo<FImpl>::makeHighModeV5D(FermionField &vout_4d, 
 | 
			
		||||
                                                    FermionField &vout_5d, 
 | 
			
		||||
                                                    const FermionField &noise)
 | 
			
		||||
{
 | 
			
		||||
    if (noise._grid->Dimensions() == fGrid_->Dimensions() - 1)
 | 
			
		||||
    {
 | 
			
		||||
        action_.ImportPhysicalFermionSource(noise, tmp5_);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        tmp5_ = noise;
 | 
			
		||||
    }
 | 
			
		||||
    makeHighModeV(vout_5d, tmp5_);
 | 
			
		||||
    action_.ExportPhysicalFermionSolution(vout_5d, vout_4d);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void A2AVectorsSchurDiagTwo<FImpl>::makeHighModeW(FermionField &wout, 
 | 
			
		||||
                                                  const FermionField &noise)
 | 
			
		||||
{
 | 
			
		||||
    wout = noise;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void A2AVectorsSchurDiagTwo<FImpl>::makeHighModeW5D(FermionField &wout_4d, 
 | 
			
		||||
                                                    FermionField &wout_5d, 
 | 
			
		||||
                                                    const FermionField &noise)
 | 
			
		||||
{
 | 
			
		||||
    if (noise._grid->Dimensions() == fGrid_->Dimensions() - 1)
 | 
			
		||||
    {
 | 
			
		||||
        action_.ImportUnphysicalFermion(noise, wout_5d);
 | 
			
		||||
        wout_4d = noise;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        wout_5d = noise;
 | 
			
		||||
        action_.ExportPhysicalFermionSource(wout_5d, wout_4d);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *               all-to-all vectors I/O template implementation               *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename Field>
 | 
			
		||||
void A2AVectorsIo::write(const std::string fileStem, std::vector<Field> &vec, 
 | 
			
		||||
                         const bool multiFile, const int trajectory)
 | 
			
		||||
{
 | 
			
		||||
    Record       record;
 | 
			
		||||
    GridBase     *grid = vec[0]._grid;
 | 
			
		||||
    ScidacWriter binWriter(grid->IsBoss());
 | 
			
		||||
    std::string  filename = vecFilename(fileStem, trajectory, multiFile);
 | 
			
		||||
 | 
			
		||||
    if (multiFile)
 | 
			
		||||
    {
 | 
			
		||||
        std::string fullFilename;
 | 
			
		||||
 | 
			
		||||
        for (unsigned int i = 0; i < vec.size(); ++i)
 | 
			
		||||
        {
 | 
			
		||||
            fullFilename = filename + "/elem" + std::to_string(i) + ".bin";
 | 
			
		||||
 | 
			
		||||
            LOG(Message) << "Writing vector " << i << std::endl;
 | 
			
		||||
            makeFileDir(fullFilename, grid);
 | 
			
		||||
            binWriter.open(fullFilename);
 | 
			
		||||
            record.index = i;
 | 
			
		||||
            binWriter.writeScidacFieldRecord(vec[i], record);
 | 
			
		||||
            binWriter.close();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        makeFileDir(filename, grid);
 | 
			
		||||
        binWriter.open(filename);
 | 
			
		||||
        for (unsigned int i = 0; i < vec.size(); ++i)
 | 
			
		||||
        {
 | 
			
		||||
            LOG(Message) << "Writing vector " << i << std::endl;
 | 
			
		||||
            record.index = i;
 | 
			
		||||
            binWriter.writeScidacFieldRecord(vec[i], record);
 | 
			
		||||
        }
 | 
			
		||||
        binWriter.close();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename Field>
 | 
			
		||||
void A2AVectorsIo::read(std::vector<Field> &vec, const std::string fileStem, 
 | 
			
		||||
                        const bool multiFile, const int trajectory)
 | 
			
		||||
{
 | 
			
		||||
    Record       record;
 | 
			
		||||
    ScidacReader binReader;
 | 
			
		||||
    std::string  filename = vecFilename(fileStem, trajectory, multiFile);
 | 
			
		||||
 | 
			
		||||
    if (multiFile)
 | 
			
		||||
    {
 | 
			
		||||
        std::string fullFilename;
 | 
			
		||||
 | 
			
		||||
        for (unsigned int i = 0; i < vec.size(); ++i)
 | 
			
		||||
        {
 | 
			
		||||
            fullFilename = filename + "/elem" + std::to_string(i) + ".bin";
 | 
			
		||||
 | 
			
		||||
            LOG(Message) << "Reading vector " << i << std::endl;
 | 
			
		||||
            binReader.open(fullFilename);
 | 
			
		||||
            binReader.readScidacFieldRecord(vec[i], record);
 | 
			
		||||
            binReader.close();
 | 
			
		||||
            if (record.index != i)
 | 
			
		||||
            {
 | 
			
		||||
                HADRONS_ERROR(Io, "vector index mismatch");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        binReader.open(filename);
 | 
			
		||||
        for (unsigned int i = 0; i < vec.size(); ++i)
 | 
			
		||||
        {
 | 
			
		||||
            LOG(Message) << "Reading vector " << i << std::endl;
 | 
			
		||||
            binReader.readScidacFieldRecord(vec[i], record);
 | 
			
		||||
            if (record.index != i)
 | 
			
		||||
            {
 | 
			
		||||
                HADRONS_ERROR(Io, "vector index mismatch");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        binReader.close();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // A2A_Vectors_hpp_
 | 
			
		||||
@@ -1,249 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/DilutedNoise.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
Author: Vera Guelpers <Vera.Guelpers@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 Hadrons_DilutedNoise_hpp_
 | 
			
		||||
#define Hadrons_DilutedNoise_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                   Abstract container for diluted noise                     *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class DilutedNoise
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef typename FImpl::FermionField FermionField;
 | 
			
		||||
public:
 | 
			
		||||
    // constructor/destructor
 | 
			
		||||
    DilutedNoise(GridCartesian *g);
 | 
			
		||||
    DilutedNoise(GridCartesian *g, const unsigned int nNoise);
 | 
			
		||||
    virtual ~DilutedNoise(void) = default;
 | 
			
		||||
    // access
 | 
			
		||||
    std::vector<FermionField> &       getNoise(void);
 | 
			
		||||
    const std::vector<FermionField> & getNoise(void) const;
 | 
			
		||||
    const FermionField &              operator[](const unsigned int i) const;
 | 
			
		||||
    FermionField &                    operator[](const unsigned int i);
 | 
			
		||||
    void                              resize(const unsigned int nNoise);
 | 
			
		||||
    unsigned int                      size(void) const;
 | 
			
		||||
    GridCartesian                     *getGrid(void) const;
 | 
			
		||||
    // generate noise (pure virtual)
 | 
			
		||||
    virtual void generateNoise(GridParallelRNG &rng) = 0;
 | 
			
		||||
private:
 | 
			
		||||
    std::vector<FermionField> noise_;
 | 
			
		||||
    GridCartesian             *grid_;
 | 
			
		||||
    unsigned int              nNoise_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TimeDilutedSpinColorDiagonalNoise: public DilutedNoise<FImpl>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef typename FImpl::FermionField FermionField;
 | 
			
		||||
public:
 | 
			
		||||
    // constructor/destructor
 | 
			
		||||
    TimeDilutedSpinColorDiagonalNoise(GridCartesian *g);
 | 
			
		||||
    virtual ~TimeDilutedSpinColorDiagonalNoise(void) = default;
 | 
			
		||||
    // generate noise
 | 
			
		||||
    virtual void generateNoise(GridParallelRNG &rng);
 | 
			
		||||
private:
 | 
			
		||||
    unsigned int nt_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class FullVolumeSpinColorDiagonalNoise: public DilutedNoise<FImpl>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef typename FImpl::FermionField FermionField;
 | 
			
		||||
public:
 | 
			
		||||
    // constructor/destructor
 | 
			
		||||
    FullVolumeSpinColorDiagonalNoise(GridCartesian *g, unsigned int n_src);
 | 
			
		||||
    virtual ~FullVolumeSpinColorDiagonalNoise(void) = default;
 | 
			
		||||
    // generate noise
 | 
			
		||||
    virtual void generateNoise(GridParallelRNG &rng);
 | 
			
		||||
private:
 | 
			
		||||
    unsigned int nSrc_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                    DilutedNoise template implementation                    *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
DilutedNoise<FImpl>::DilutedNoise(GridCartesian *g)
 | 
			
		||||
: grid_(g)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
DilutedNoise<FImpl>::DilutedNoise(GridCartesian *g,
 | 
			
		||||
                                  const unsigned int nNoise)
 | 
			
		||||
: DilutedNoise(g)
 | 
			
		||||
{
 | 
			
		||||
    resize(nNoise);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<typename DilutedNoise<FImpl>::FermionField> & DilutedNoise<FImpl>::
 | 
			
		||||
getNoise(void)
 | 
			
		||||
{
 | 
			
		||||
    return noise_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
const std::vector<typename DilutedNoise<FImpl>::FermionField> & DilutedNoise<FImpl>::
 | 
			
		||||
getNoise(void) const
 | 
			
		||||
{
 | 
			
		||||
    return noise_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
const typename DilutedNoise<FImpl>::FermionField & 
 | 
			
		||||
DilutedNoise<FImpl>::operator[](const unsigned int i) const
 | 
			
		||||
{
 | 
			
		||||
    return noise_[i];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
typename DilutedNoise<FImpl>::FermionField & 
 | 
			
		||||
DilutedNoise<FImpl>::operator[](const unsigned int i)
 | 
			
		||||
{
 | 
			
		||||
    return noise_[i];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void DilutedNoise<FImpl>::resize(const unsigned int nNoise)
 | 
			
		||||
{
 | 
			
		||||
    nNoise_ = nNoise;
 | 
			
		||||
    noise_.resize(nNoise, grid_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
unsigned int DilutedNoise<FImpl>::size(void) const
 | 
			
		||||
{  
 | 
			
		||||
    return noise_.size();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
GridCartesian * DilutedNoise<FImpl>::getGrid(void) const
 | 
			
		||||
{
 | 
			
		||||
    return grid_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *        TimeDilutedSpinColorDiagonalNoise template implementation           *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
TimeDilutedSpinColorDiagonalNoise<FImpl>::
 | 
			
		||||
TimeDilutedSpinColorDiagonalNoise(GridCartesian *g)
 | 
			
		||||
: DilutedNoise<FImpl>(g)
 | 
			
		||||
{
 | 
			
		||||
    nt_ = this->getGrid()->GlobalDimensions().back();
 | 
			
		||||
    this->resize(nt_*Ns*FImpl::Dimension);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TimeDilutedSpinColorDiagonalNoise<FImpl>::generateNoise(GridParallelRNG &rng)
 | 
			
		||||
{
 | 
			
		||||
    typedef decltype(peekColour((*this)[0], 0)) SpinField;
 | 
			
		||||
 | 
			
		||||
    auto                       &noise = *this;
 | 
			
		||||
    auto                       g      = this->getGrid();
 | 
			
		||||
    auto                       nd     = g->GlobalDimensions().size();
 | 
			
		||||
    auto                       nc     = FImpl::Dimension;
 | 
			
		||||
    Complex                    shift(1., 1.);
 | 
			
		||||
    Lattice<iScalar<vInteger>> tLat(g);
 | 
			
		||||
    LatticeComplex             eta(g), etaCut(g);
 | 
			
		||||
    SpinField                  etas(g);
 | 
			
		||||
    unsigned int               i = 0;
 | 
			
		||||
 | 
			
		||||
    LatticeCoordinate(tLat, nd - 1);
 | 
			
		||||
    bernoulli(rng, eta);
 | 
			
		||||
    eta = (2.*eta - shift)*(1./::sqrt(2.));
 | 
			
		||||
    for (unsigned int t = 0; t < nt_; ++t)
 | 
			
		||||
    {
 | 
			
		||||
        etaCut = where((tLat == t), eta, 0.*eta);
 | 
			
		||||
        for (unsigned int s = 0; s < Ns; ++s)
 | 
			
		||||
        {
 | 
			
		||||
            etas = zero;
 | 
			
		||||
            pokeSpin(etas, etaCut, s);
 | 
			
		||||
            for (unsigned int c = 0; c < nc; ++c)
 | 
			
		||||
            {
 | 
			
		||||
                noise[i] = zero;
 | 
			
		||||
                pokeColour(noise[i], etas, c);
 | 
			
		||||
                i++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *        FullVolumeSpinColorDiagonalNoise template implementation           *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
FullVolumeSpinColorDiagonalNoise<FImpl>::
 | 
			
		||||
FullVolumeSpinColorDiagonalNoise(GridCartesian *g, unsigned int nSrc)
 | 
			
		||||
: DilutedNoise<FImpl>(g, nSrc*Ns*FImpl::Dimension), nSrc_(nSrc)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void FullVolumeSpinColorDiagonalNoise<FImpl>::generateNoise(GridParallelRNG &rng)
 | 
			
		||||
{
 | 
			
		||||
    typedef decltype(peekColour((*this)[0], 0)) SpinField;
 | 
			
		||||
 | 
			
		||||
    auto                       &noise = *this;
 | 
			
		||||
    auto                       g      = this->getGrid();
 | 
			
		||||
    auto                       nd     = g->GlobalDimensions().size();
 | 
			
		||||
    auto                       nc     = FImpl::Dimension;
 | 
			
		||||
    Complex                    shift(1., 1.);
 | 
			
		||||
    LatticeComplex             eta(g);
 | 
			
		||||
    SpinField                  etas(g);
 | 
			
		||||
    unsigned int               i = 0;
 | 
			
		||||
 | 
			
		||||
    bernoulli(rng, eta);
 | 
			
		||||
    eta = (2.*eta - shift)*(1./::sqrt(2.));
 | 
			
		||||
    for (unsigned int n = 0; n < nSrc_; ++n)
 | 
			
		||||
    {
 | 
			
		||||
        for (unsigned int s = 0; s < Ns; ++s)
 | 
			
		||||
        {
 | 
			
		||||
            etas = zero;
 | 
			
		||||
            pokeSpin(etas, eta, s);
 | 
			
		||||
            for (unsigned int c = 0; c < nc; ++c)
 | 
			
		||||
            {
 | 
			
		||||
                noise[i] = zero;
 | 
			
		||||
                pokeColour(noise[i], etas, c);
 | 
			
		||||
                i++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_DilutedNoise_hpp_
 | 
			
		||||
@@ -1,385 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/DiskVector.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_DiskVector_hpp_
 | 
			
		||||
#define Hadrons_DiskVector_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <deque>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <ftw.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#ifdef DV_DEBUG
 | 
			
		||||
#define DV_DEBUG_MSG(dv, stream) LOG(Debug) << "diskvector " << (dv) << ": " << stream << std::endl
 | 
			
		||||
#else
 | 
			
		||||
#define DV_DEBUG_MSG(dv, stream)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                           Abstract base class                              *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename T>
 | 
			
		||||
class DiskVectorBase
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef T ObjectType;
 | 
			
		||||
 | 
			
		||||
    // helper for read/write vector access
 | 
			
		||||
    class RwAccessHelper
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        RwAccessHelper(DiskVectorBase<T> &master, const unsigned int i)
 | 
			
		||||
        : master_(master), cmaster_(master), i_(i) {}
 | 
			
		||||
 | 
			
		||||
        // operator=: somebody is trying to store a vector element
 | 
			
		||||
        // write to disk and cache
 | 
			
		||||
        T &operator=(const T &obj) const
 | 
			
		||||
        {
 | 
			
		||||
            DV_DEBUG_MSG(&master_, "writing to " << i_);
 | 
			
		||||
            master_.cacheInsert(i_, obj);
 | 
			
		||||
            master_.save(master_.filename(i_), obj);
 | 
			
		||||
            
 | 
			
		||||
            return master_.cachePtr_->at(i_);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // implicit cast to const object reference and redirection
 | 
			
		||||
        // to the const operator[] for read-only operations
 | 
			
		||||
        operator const T&() const
 | 
			
		||||
        {
 | 
			
		||||
            return cmaster_[i_];
 | 
			
		||||
        }
 | 
			
		||||
    private:
 | 
			
		||||
        DiskVectorBase<T>       &master_;
 | 
			
		||||
        const DiskVectorBase<T> &cmaster_;
 | 
			
		||||
        const unsigned int      i_;
 | 
			
		||||
    };
 | 
			
		||||
public:
 | 
			
		||||
    DiskVectorBase(const std::string dirname, const unsigned int size = 0,
 | 
			
		||||
                   const unsigned int cacheSize = 1, const bool clean = true);
 | 
			
		||||
    virtual ~DiskVectorBase(void);
 | 
			
		||||
    const T & operator[](const unsigned int i) const;
 | 
			
		||||
    RwAccessHelper operator[](const unsigned int i);
 | 
			
		||||
    double hitRatio(void) const;
 | 
			
		||||
    void resetStat(void);
 | 
			
		||||
private:
 | 
			
		||||
    virtual void load(T &obj, const std::string filename) const = 0;
 | 
			
		||||
    virtual void save(const std::string filename, const T &obj) const = 0;
 | 
			
		||||
    virtual std::string filename(const unsigned int i) const;
 | 
			
		||||
    void evict(void) const;
 | 
			
		||||
    void fetch(const unsigned int i) const;
 | 
			
		||||
    void cacheInsert(const unsigned int i, const T &obj) const;
 | 
			
		||||
    void clean(void);
 | 
			
		||||
private:
 | 
			
		||||
    std::string                                dirname_;
 | 
			
		||||
    unsigned int                               size_, cacheSize_;
 | 
			
		||||
    double                                     access_{0.}, hit_{0.};
 | 
			
		||||
    bool                                       clean_;
 | 
			
		||||
    // using pointers to allow modifications when class is const
 | 
			
		||||
    // semantic: const means data unmodified, but cache modification allowed
 | 
			
		||||
    std::unique_ptr<std::map<unsigned int, T>> cachePtr_;
 | 
			
		||||
    std::unique_ptr<std::deque<unsigned int>>  loadsPtr_;                
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                   Specialisation for serialisable classes                  *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename T, typename Reader, typename Writer>
 | 
			
		||||
class SerializableDiskVector: public DiskVectorBase<T>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    using DiskVectorBase<T>::DiskVectorBase;
 | 
			
		||||
private:
 | 
			
		||||
    virtual void load(T &obj, const std::string filename) const
 | 
			
		||||
    {
 | 
			
		||||
        Reader reader(filename);
 | 
			
		||||
 | 
			
		||||
        read(reader, basename(filename), obj);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void save(const std::string filename, const T &obj) const
 | 
			
		||||
    {
 | 
			
		||||
        Writer writer(filename);
 | 
			
		||||
 | 
			
		||||
        write(writer, basename(filename), obj);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                      Specialisation for Eigen matrices                     *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename T>
 | 
			
		||||
using EigenDiskVectorMat = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class EigenDiskVector: public DiskVectorBase<EigenDiskVectorMat<T>>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    using DiskVectorBase<EigenDiskVectorMat<T>>::DiskVectorBase;
 | 
			
		||||
    typedef EigenDiskVectorMat<T> Matrix;
 | 
			
		||||
public:
 | 
			
		||||
    T operator()(const unsigned int i, const Eigen::Index j,
 | 
			
		||||
                 const Eigen::Index k) const
 | 
			
		||||
    {
 | 
			
		||||
        return (*this)[i](j, k);
 | 
			
		||||
    }
 | 
			
		||||
private:
 | 
			
		||||
    virtual void load(EigenDiskVectorMat<T> &obj, const std::string filename) const
 | 
			
		||||
    {
 | 
			
		||||
        std::ifstream              f(filename, std::ios::binary);
 | 
			
		||||
        std::vector<unsigned char> hash(SHA256_DIGEST_LENGTH);
 | 
			
		||||
        Eigen::Index               nRow, nCol;
 | 
			
		||||
        size_t                     matSize;
 | 
			
		||||
        double                     t;
 | 
			
		||||
 | 
			
		||||
        f.read(reinterpret_cast<char *>(hash.data()), hash.size()*sizeof(unsigned char));
 | 
			
		||||
        f.read(reinterpret_cast<char *>(&nRow), sizeof(Eigen::Index));
 | 
			
		||||
        f.read(reinterpret_cast<char *>(&nCol), sizeof(Eigen::Index));
 | 
			
		||||
        obj.resize(nRow, nCol);
 | 
			
		||||
        matSize = nRow*nCol*sizeof(T);
 | 
			
		||||
        t  = -usecond();
 | 
			
		||||
        f.read(reinterpret_cast<char *>(obj.data()), matSize);
 | 
			
		||||
        t += usecond();
 | 
			
		||||
        DV_DEBUG_MSG(this, "Eigen read " << matSize/t*1.0e6/1024/1024 << " MB/s");
 | 
			
		||||
        auto check = GridChecksum::sha256(obj.data(), matSize);
 | 
			
		||||
        DV_DEBUG_MSG(this, "Eigen sha256 " << GridChecksum::sha256_string(check));
 | 
			
		||||
        if (hash != check)
 | 
			
		||||
        {
 | 
			
		||||
            HADRONS_ERROR(Io, "checksum failed")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void save(const std::string filename, const EigenDiskVectorMat<T> &obj) const
 | 
			
		||||
    {
 | 
			
		||||
        std::ofstream              f(filename, std::ios::binary);
 | 
			
		||||
        std::vector<unsigned char> hash(SHA256_DIGEST_LENGTH);
 | 
			
		||||
        Eigen::Index               nRow, nCol;
 | 
			
		||||
        size_t                     matSize;
 | 
			
		||||
        double                     t;
 | 
			
		||||
        
 | 
			
		||||
        nRow    = obj.rows();
 | 
			
		||||
        nCol    = obj.cols();
 | 
			
		||||
        matSize = nRow*nCol*sizeof(T);
 | 
			
		||||
        hash    = GridChecksum::sha256(obj.data(), matSize);
 | 
			
		||||
        DV_DEBUG_MSG(this, "Eigen sha256 " << GridChecksum::sha256_string(hash));
 | 
			
		||||
        f.write(reinterpret_cast<char *>(hash.data()), hash.size()*sizeof(unsigned char));
 | 
			
		||||
        f.write(reinterpret_cast<char *>(&nRow), sizeof(Eigen::Index));
 | 
			
		||||
        f.write(reinterpret_cast<char *>(&nCol), sizeof(Eigen::Index));
 | 
			
		||||
        t  = -usecond();
 | 
			
		||||
        f.write(reinterpret_cast<const char *>(obj.data()), matSize);
 | 
			
		||||
        t += usecond();
 | 
			
		||||
        DV_DEBUG_MSG(this, "Eigen write " << matSize/t*1.0e6/1024/1024 << " MB/s");
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                       DiskVectorBase implementation                         *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
template <typename T>
 | 
			
		||||
DiskVectorBase<T>::DiskVectorBase(const std::string dirname, 
 | 
			
		||||
                                  const unsigned int size,
 | 
			
		||||
                                  const unsigned int cacheSize,
 | 
			
		||||
                                  const bool clean)
 | 
			
		||||
: dirname_(dirname), size_(size), cacheSize_(cacheSize), clean_(clean)
 | 
			
		||||
, cachePtr_(new std::map<unsigned int, T>())
 | 
			
		||||
, loadsPtr_(new std::deque<unsigned int>())
 | 
			
		||||
{
 | 
			
		||||
    struct stat s;
 | 
			
		||||
 | 
			
		||||
    if(stat(dirname.c_str(), &s) == 0)
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR(Io, "directory '" + dirname + "' already exists")
 | 
			
		||||
    }
 | 
			
		||||
    mkdir(dirname);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
DiskVectorBase<T>::~DiskVectorBase(void)
 | 
			
		||||
{
 | 
			
		||||
    if (clean_)
 | 
			
		||||
    {
 | 
			
		||||
        clean();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
const T & DiskVectorBase<T>::operator[](const unsigned int i) const
 | 
			
		||||
{
 | 
			
		||||
    auto &cache  = *cachePtr_;
 | 
			
		||||
    auto &loads  = *loadsPtr_;
 | 
			
		||||
 | 
			
		||||
    DV_DEBUG_MSG(this, "accessing " << i << " (RO)");
 | 
			
		||||
 | 
			
		||||
    if (i >= size_)
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR(Size, "index out of range");
 | 
			
		||||
    }
 | 
			
		||||
    const_cast<double &>(access_)++;
 | 
			
		||||
    if (cache.find(i) == cache.end())
 | 
			
		||||
    {
 | 
			
		||||
        // cache miss
 | 
			
		||||
        DV_DEBUG_MSG(this, "cache miss");
 | 
			
		||||
        fetch(i);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        DV_DEBUG_MSG(this, "cache hit");
 | 
			
		||||
 | 
			
		||||
        auto pos = std::find(loads.begin(), loads.end(), i);
 | 
			
		||||
 | 
			
		||||
        const_cast<double &>(hit_)++;
 | 
			
		||||
        loads.erase(pos);
 | 
			
		||||
        loads.push_back(i);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef DV_DEBUG
 | 
			
		||||
    std::string msg;
 | 
			
		||||
 | 
			
		||||
    for (auto &p: loads)
 | 
			
		||||
    {
 | 
			
		||||
        msg += std::to_string(p) + " ";
 | 
			
		||||
    }
 | 
			
		||||
    DV_DEBUG_MSG(this, "in cache: " << msg);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return cache.at(i);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
typename DiskVectorBase<T>::RwAccessHelper DiskVectorBase<T>::operator[](const unsigned int i)
 | 
			
		||||
{
 | 
			
		||||
    DV_DEBUG_MSG(this, "accessing " << i << " (RW)");
 | 
			
		||||
 | 
			
		||||
    if (i >= size_)
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR(Size, "index out of range");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return RwAccessHelper(*this, i);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
double DiskVectorBase<T>::hitRatio(void) const
 | 
			
		||||
{
 | 
			
		||||
    return hit_/access_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
void DiskVectorBase<T>::resetStat(void)
 | 
			
		||||
{
 | 
			
		||||
    access_ = 0.;
 | 
			
		||||
    hit_    = 0.;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
std::string DiskVectorBase<T>::filename(const unsigned int i) const
 | 
			
		||||
{
 | 
			
		||||
    return dirname_ + "/elem_" + std::to_string(i);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
void DiskVectorBase<T>::evict(void) const
 | 
			
		||||
{
 | 
			
		||||
    auto &cache = *cachePtr_;
 | 
			
		||||
    auto &loads = *loadsPtr_;
 | 
			
		||||
 | 
			
		||||
    if (cache.size() >= cacheSize_)
 | 
			
		||||
    {
 | 
			
		||||
        DV_DEBUG_MSG(this, "evicting " << loads.front());
 | 
			
		||||
        cache.erase(loads.front());
 | 
			
		||||
        loads.pop_front();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
void DiskVectorBase<T>::fetch(const unsigned int i) const
 | 
			
		||||
{
 | 
			
		||||
    auto &cache = *cachePtr_;
 | 
			
		||||
    auto &loads = *loadsPtr_;
 | 
			
		||||
    struct stat s;
 | 
			
		||||
 | 
			
		||||
    DV_DEBUG_MSG(this, "loading " << i << " from disk");
 | 
			
		||||
 | 
			
		||||
    evict();
 | 
			
		||||
    if(stat(filename(i).c_str(), &s) != 0)
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR(Io, "disk vector element " + std::to_string(i) + " uninitialised");
 | 
			
		||||
    }
 | 
			
		||||
    load(cache[i], filename(i));
 | 
			
		||||
    loads.push_back(i);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
void DiskVectorBase<T>::cacheInsert(const unsigned int i, const T &obj) const
 | 
			
		||||
{
 | 
			
		||||
    auto &cache = *cachePtr_;
 | 
			
		||||
    auto &loads = *loadsPtr_;
 | 
			
		||||
 | 
			
		||||
    evict();
 | 
			
		||||
    cache[i] = obj;
 | 
			
		||||
    loads.push_back(i);
 | 
			
		||||
 | 
			
		||||
#ifdef DV_DEBUG
 | 
			
		||||
    std::string msg;
 | 
			
		||||
 | 
			
		||||
    for (auto &p: loads)
 | 
			
		||||
    {
 | 
			
		||||
        msg += std::to_string(p) + " ";
 | 
			
		||||
    }
 | 
			
		||||
    DV_DEBUG_MSG(this, "in cache: " << msg);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef DV_DEBUG
 | 
			
		||||
#undef DV_DEBUG_MSG
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
void DiskVectorBase<T>::clean(void)
 | 
			
		||||
{
 | 
			
		||||
    auto unlink = [](const char *fpath, const struct stat *sb, 
 | 
			
		||||
                     int typeflag, struct FTW *ftwbuf)
 | 
			
		||||
    {
 | 
			
		||||
        int rv = remove(fpath);
 | 
			
		||||
 | 
			
		||||
        if (rv)
 | 
			
		||||
        {
 | 
			
		||||
            HADRONS_ERROR(Io, "cannot remove '" + std::string(fpath) + "': "
 | 
			
		||||
                          + std::string(std::strerror(errno)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return rv;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    nftw(dirname_.c_str(), unlink, 64, FTW_DEPTH | FTW_PHYS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_DiskVector_hpp_
 | 
			
		||||
@@ -1,414 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/EigenPack.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_EigenPack_hpp_
 | 
			
		||||
#define Hadrons_EigenPack_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/algorithms/iterative/Deflation.h>
 | 
			
		||||
#include <Grid/algorithms/iterative/LocalCoherenceLanczos.h>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
// Lanczos type
 | 
			
		||||
#ifndef HADRONS_DEFAULT_LANCZOS_NBASIS
 | 
			
		||||
#define HADRONS_DEFAULT_LANCZOS_NBASIS 60
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HADRONS_DUMP_EP_METADATA(record) \
 | 
			
		||||
LOG(Message) << "Eigenpack metadata:" << std::endl;\
 | 
			
		||||
LOG(Message) << "* operator" << std::endl;\
 | 
			
		||||
LOG(Message) << (record).operatorXml << std::endl;\
 | 
			
		||||
LOG(Message) << "* solver" << std::endl;\
 | 
			
		||||
LOG(Message) << (record).solverXml << std::endl;
 | 
			
		||||
 | 
			
		||||
struct PackRecord
 | 
			
		||||
{
 | 
			
		||||
    std::string operatorXml, solverXml;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct VecRecord: Serializable
 | 
			
		||||
{
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(VecRecord,
 | 
			
		||||
                                    unsigned int, index,
 | 
			
		||||
                                    double,       eval);
 | 
			
		||||
    VecRecord(void): index(0), eval(0.) {}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
namespace EigenPackIo
 | 
			
		||||
{
 | 
			
		||||
    inline void readHeader(PackRecord &record, ScidacReader &binReader)
 | 
			
		||||
    {
 | 
			
		||||
        std::string recordXml;
 | 
			
		||||
 | 
			
		||||
        binReader.readLimeObject(recordXml, SCIDAC_FILE_XML);
 | 
			
		||||
        XmlReader xmlReader(recordXml, true, "eigenPackPar");
 | 
			
		||||
        xmlReader.push();
 | 
			
		||||
        xmlReader.readCurrentSubtree(record.operatorXml);
 | 
			
		||||
        xmlReader.nextElement();
 | 
			
		||||
        xmlReader.readCurrentSubtree(record.solverXml);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename T, typename TIo = T>
 | 
			
		||||
    void readElement(T &evec, RealD &eval, const unsigned int index,
 | 
			
		||||
                     ScidacReader &binReader, TIo *ioBuf = nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        VecRecord vecRecord;
 | 
			
		||||
 | 
			
		||||
        LOG(Message) << "Reading eigenvector " << index << std::endl;
 | 
			
		||||
        if (ioBuf == nullptr)
 | 
			
		||||
        {
 | 
			
		||||
            binReader.readScidacFieldRecord(evec, vecRecord);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            binReader.readScidacFieldRecord(*ioBuf, vecRecord);
 | 
			
		||||
            precisionChange(evec, *ioBuf);
 | 
			
		||||
        }
 | 
			
		||||
        if (vecRecord.index != index)
 | 
			
		||||
        {
 | 
			
		||||
            HADRONS_ERROR(Io, "Eigenvector " + std::to_string(index) + " has a"
 | 
			
		||||
                            + " wrong index (expected " + std::to_string(vecRecord.index) 
 | 
			
		||||
                            + ")");
 | 
			
		||||
        }
 | 
			
		||||
        eval = vecRecord.eval;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename T, typename TIo = T>
 | 
			
		||||
    static void readPack(std::vector<T> &evec, std::vector<RealD> &eval,
 | 
			
		||||
                         PackRecord &record, const std::string filename, 
 | 
			
		||||
                         const unsigned int size, bool multiFile, 
 | 
			
		||||
                         GridBase *gridIo = nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        std::unique_ptr<TIo> ioBuf{nullptr};
 | 
			
		||||
        ScidacReader         binReader;
 | 
			
		||||
 | 
			
		||||
        if (typeHash<T>() != typeHash<TIo>())
 | 
			
		||||
        {
 | 
			
		||||
            if (gridIo == nullptr)
 | 
			
		||||
            {
 | 
			
		||||
                HADRONS_ERROR(Definition, 
 | 
			
		||||
                              "I/O type different from vector type but null I/O grid passed");
 | 
			
		||||
            }
 | 
			
		||||
            ioBuf.reset(new TIo(gridIo));
 | 
			
		||||
        }
 | 
			
		||||
        if (multiFile)
 | 
			
		||||
        {
 | 
			
		||||
            std::string fullFilename;
 | 
			
		||||
 | 
			
		||||
            for(int k = 0; k < size; ++k) 
 | 
			
		||||
            {
 | 
			
		||||
                fullFilename = filename + "/v" + std::to_string(k) + ".bin";
 | 
			
		||||
                binReader.open(fullFilename);
 | 
			
		||||
                readHeader(record, binReader);
 | 
			
		||||
                readElement(evec[k], eval[k], k, binReader, ioBuf.get());
 | 
			
		||||
                binReader.close();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            binReader.open(filename);
 | 
			
		||||
            readHeader(record, binReader);
 | 
			
		||||
            for(int k = 0; k < size; ++k) 
 | 
			
		||||
            {
 | 
			
		||||
                readElement(evec[k], eval[k], k, binReader, ioBuf.get());
 | 
			
		||||
            }
 | 
			
		||||
            binReader.close();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline void writeHeader(ScidacWriter &binWriter, PackRecord &record)
 | 
			
		||||
    {
 | 
			
		||||
        XmlWriter xmlWriter("", "eigenPackPar");
 | 
			
		||||
 | 
			
		||||
        xmlWriter.pushXmlString(record.operatorXml);
 | 
			
		||||
        xmlWriter.pushXmlString(record.solverXml);
 | 
			
		||||
        binWriter.writeLimeObject(1, 1, xmlWriter, "parameters", SCIDAC_FILE_XML);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename T, typename TIo = T>
 | 
			
		||||
    void writeElement(ScidacWriter &binWriter, T &evec, RealD &eval, 
 | 
			
		||||
                      const unsigned int index, TIo *ioBuf, 
 | 
			
		||||
                      T *testBuf = nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        VecRecord vecRecord;
 | 
			
		||||
 | 
			
		||||
        LOG(Message) << "Writing eigenvector " << index << std::endl;
 | 
			
		||||
        vecRecord.eval  = eval;
 | 
			
		||||
        vecRecord.index = index;
 | 
			
		||||
        if ((ioBuf == nullptr) || (testBuf == nullptr))
 | 
			
		||||
        {
 | 
			
		||||
            binWriter.writeScidacFieldRecord(evec, vecRecord, DEFAULT_ASCII_PREC);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            precisionChange(*ioBuf, evec);
 | 
			
		||||
            precisionChange(*testBuf, *ioBuf);
 | 
			
		||||
            *testBuf -= evec;
 | 
			
		||||
            LOG(Message) << "Precision diff norm^2 " << norm2(*testBuf) << std::endl;
 | 
			
		||||
            binWriter.writeScidacFieldRecord(*ioBuf, vecRecord, DEFAULT_ASCII_PREC);
 | 
			
		||||
        }   
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    template <typename T, typename TIo = T>
 | 
			
		||||
    static void writePack(const std::string filename, std::vector<T> &evec, 
 | 
			
		||||
                          std::vector<RealD> &eval, PackRecord &record, 
 | 
			
		||||
                          const unsigned int size, bool multiFile, 
 | 
			
		||||
                          GridBase *gridIo = nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        GridBase             *grid = evec[0]._grid;
 | 
			
		||||
        std::unique_ptr<TIo> ioBuf{nullptr}; 
 | 
			
		||||
        std::unique_ptr<T>   testBuf{nullptr};
 | 
			
		||||
        ScidacWriter         binWriter(grid->IsBoss());
 | 
			
		||||
 | 
			
		||||
        if (typeHash<T>() != typeHash<TIo>())
 | 
			
		||||
        {
 | 
			
		||||
            if (gridIo == nullptr)
 | 
			
		||||
            {
 | 
			
		||||
                HADRONS_ERROR(Definition, 
 | 
			
		||||
                              "I/O type different from vector type but null I/O grid passed");
 | 
			
		||||
            }
 | 
			
		||||
            ioBuf.reset(new TIo(gridIo));
 | 
			
		||||
            testBuf.reset(new T(grid));
 | 
			
		||||
        }
 | 
			
		||||
        if (multiFile)
 | 
			
		||||
        {
 | 
			
		||||
            std::string fullFilename;
 | 
			
		||||
 | 
			
		||||
            for(int k = 0; k < size; ++k) 
 | 
			
		||||
            {
 | 
			
		||||
                fullFilename = filename + "/v" + std::to_string(k) + ".bin";
 | 
			
		||||
 | 
			
		||||
                makeFileDir(fullFilename, grid);
 | 
			
		||||
                binWriter.open(fullFilename);
 | 
			
		||||
                writeHeader(binWriter, record);
 | 
			
		||||
                writeElement(binWriter, evec[k], eval[k], k, ioBuf.get(), testBuf.get());
 | 
			
		||||
                binWriter.close();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            makeFileDir(filename, grid);
 | 
			
		||||
            binWriter.open(filename);
 | 
			
		||||
            writeHeader(binWriter, record);
 | 
			
		||||
            for(int k = 0; k < size; ++k) 
 | 
			
		||||
            {
 | 
			
		||||
                writeElement(binWriter, evec[k], eval[k], k, ioBuf.get(), testBuf.get());
 | 
			
		||||
            }
 | 
			
		||||
            binWriter.close();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename F>
 | 
			
		||||
class BaseEigenPack
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef F Field;
 | 
			
		||||
public:
 | 
			
		||||
    std::vector<RealD> eval;
 | 
			
		||||
    std::vector<F>     evec;
 | 
			
		||||
    PackRecord         record;
 | 
			
		||||
public:
 | 
			
		||||
    BaseEigenPack(void)          = default;
 | 
			
		||||
    BaseEigenPack(const size_t size, GridBase *grid)
 | 
			
		||||
    {
 | 
			
		||||
        resize(size, grid);
 | 
			
		||||
    }
 | 
			
		||||
    virtual ~BaseEigenPack(void) = default;
 | 
			
		||||
    void resize(const size_t size, GridBase *grid)
 | 
			
		||||
    {
 | 
			
		||||
        eval.resize(size);
 | 
			
		||||
        evec.resize(size, grid);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename F, typename FIo = F>
 | 
			
		||||
class EigenPack: public BaseEigenPack<F>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef F   Field;
 | 
			
		||||
    typedef FIo FieldIo;
 | 
			
		||||
public:
 | 
			
		||||
    EigenPack(void)          = default;
 | 
			
		||||
    virtual ~EigenPack(void) = default;
 | 
			
		||||
 | 
			
		||||
    EigenPack(const size_t size, GridBase *grid, GridBase *gridIo = nullptr)
 | 
			
		||||
    : BaseEigenPack<F>(size, grid)
 | 
			
		||||
    {
 | 
			
		||||
        if (typeHash<F>() != typeHash<FIo>())
 | 
			
		||||
        {
 | 
			
		||||
            if (gridIo == nullptr)
 | 
			
		||||
            {
 | 
			
		||||
                HADRONS_ERROR(Definition, 
 | 
			
		||||
                              "I/O type different from vector type but null I/O grid passed");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        gridIo_ = gridIo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void read(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        EigenPackIo::readPack<F, FIo>(this->evec, this->eval, this->record, 
 | 
			
		||||
                                      evecFilename(fileStem, traj, multiFile), 
 | 
			
		||||
                                      this->evec.size(), multiFile, gridIo_);
 | 
			
		||||
        HADRONS_DUMP_EP_METADATA(this->record);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void write(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        EigenPackIo::writePack<F, FIo>(evecFilename(fileStem, traj, multiFile), 
 | 
			
		||||
                                       this->evec, this->eval, this->record, 
 | 
			
		||||
                                       this->evec.size(), multiFile, gridIo_);
 | 
			
		||||
    }
 | 
			
		||||
protected:
 | 
			
		||||
    std::string evecFilename(const std::string stem, const int traj, const bool multiFile)
 | 
			
		||||
    {
 | 
			
		||||
        std::string t = (traj < 0) ? "" : ("." + std::to_string(traj));
 | 
			
		||||
 | 
			
		||||
        if (multiFile)
 | 
			
		||||
        {
 | 
			
		||||
            return stem + t;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            return stem + t + ".bin";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
protected:
 | 
			
		||||
    GridBase *gridIo_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FineF, typename CoarseF, 
 | 
			
		||||
          typename FineFIo = FineF, typename CoarseFIo = CoarseF>
 | 
			
		||||
class CoarseEigenPack: public EigenPack<FineF, FineFIo>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef CoarseF CoarseField;         
 | 
			
		||||
    std::vector<CoarseF> evecCoarse;
 | 
			
		||||
    std::vector<RealD>   evalCoarse;
 | 
			
		||||
public:
 | 
			
		||||
    CoarseEigenPack(void)          = default;
 | 
			
		||||
    virtual ~CoarseEigenPack(void) = default;
 | 
			
		||||
 | 
			
		||||
    CoarseEigenPack(const size_t sizeFine, const size_t sizeCoarse, 
 | 
			
		||||
                    GridBase *gridFine, GridBase *gridCoarse,
 | 
			
		||||
                    GridBase *gridFineIo = nullptr, 
 | 
			
		||||
                    GridBase *gridCoarseIo = nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        if (typeHash<FineF>() != typeHash<FineFIo>())
 | 
			
		||||
        {
 | 
			
		||||
            if (gridFineIo == nullptr)
 | 
			
		||||
            {
 | 
			
		||||
                HADRONS_ERROR(Definition, 
 | 
			
		||||
                              "Fine I/O type different from vector type but null fine I/O grid passed");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (typeHash<CoarseF>() != typeHash<CoarseFIo>())
 | 
			
		||||
        {
 | 
			
		||||
            if (gridCoarseIo == nullptr)
 | 
			
		||||
            {
 | 
			
		||||
                HADRONS_ERROR(Definition, 
 | 
			
		||||
                              "Coarse I/O type different from vector type but null coarse I/O grid passed");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this->gridIo_ = gridFineIo;
 | 
			
		||||
        gridCoarseIo_ = gridCoarseIo;
 | 
			
		||||
        resize(sizeFine, sizeCoarse, gridFine, gridCoarse);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void resize(const size_t sizeFine, const size_t sizeCoarse, 
 | 
			
		||||
                GridBase *gridFine, GridBase *gridCoarse)
 | 
			
		||||
    {
 | 
			
		||||
        EigenPack<FineF, FineFIo>::resize(sizeFine, gridFine);
 | 
			
		||||
        evalCoarse.resize(sizeCoarse);
 | 
			
		||||
        evecCoarse.resize(sizeCoarse, gridCoarse);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void readFine(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        EigenPack<FineF, FineFIo>::read(fileStem + "_fine", multiFile, traj);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void readCoarse(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        PackRecord dummy;
 | 
			
		||||
 | 
			
		||||
        EigenPackIo::readPack<CoarseF, CoarseFIo>(evecCoarse, evalCoarse, dummy, 
 | 
			
		||||
                              this->evecFilename(fileStem + "_coarse", traj, multiFile), 
 | 
			
		||||
                              evecCoarse.size(), multiFile, gridCoarseIo_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void read(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        readFine(fileStem, multiFile, traj);
 | 
			
		||||
        readCoarse(fileStem, multiFile, traj);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void writeFine(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        EigenPack<FineF, FineFIo>::write(fileStem + "_fine", multiFile, traj);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void writeCoarse(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        EigenPackIo::writePack<CoarseF, CoarseFIo>(this->evecFilename(fileStem + "_coarse", traj, multiFile), 
 | 
			
		||||
                                                   evecCoarse, evalCoarse, this->record, 
 | 
			
		||||
                                                   evecCoarse.size(), multiFile, gridCoarseIo_);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    virtual void write(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        writeFine(fileStem, multiFile, traj);
 | 
			
		||||
        writeCoarse(fileStem, multiFile, traj);
 | 
			
		||||
    }
 | 
			
		||||
private:
 | 
			
		||||
    GridBase *gridCoarseIo_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
using BaseFermionEigenPack = BaseEigenPack<typename FImpl::FermionField>;
 | 
			
		||||
 | 
			
		||||
template <typename FImpl, typename FImplIo = FImpl>
 | 
			
		||||
using FermionEigenPack = EigenPack<typename FImpl::FermionField, typename FImplIo::FermionField>;
 | 
			
		||||
 | 
			
		||||
template <typename FImpl, int nBasis, typename FImplIo = FImpl>
 | 
			
		||||
using CoarseFermionEigenPack = CoarseEigenPack<
 | 
			
		||||
    typename FImpl::FermionField,
 | 
			
		||||
    typename LocalCoherenceLanczos<typename FImpl::SiteSpinor, 
 | 
			
		||||
                                   typename FImpl::SiteComplex, 
 | 
			
		||||
                                   nBasis>::CoarseField,
 | 
			
		||||
    typename FImplIo::FermionField,
 | 
			
		||||
    typename LocalCoherenceLanczos<typename FImplIo::SiteSpinor, 
 | 
			
		||||
                                   typename FImplIo::SiteComplex, 
 | 
			
		||||
                                   nBasis>::CoarseField>;
 | 
			
		||||
 | 
			
		||||
#undef HADRONS_DUMP_EP_METADATA
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_EigenPack_hpp_
 | 
			
		||||
@@ -1,72 +0,0 @@
 | 
			
		||||
#include <Hadrons/Modules/MContraction/Baryon.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MContraction/A2AAslashField.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MContraction/A2AMesonField.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MContraction/Meson.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MContraction/WeakHamiltonian.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MContraction/DiscLoop.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MContraction/Gamma3pt.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MContraction/WardIdentity.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MFermion/FreeProp.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MFermion/GaugeProp.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSource/SeqGamma.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSource/Point.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSource/Wall.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSource/Z2.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSource/SeqConserved.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSource/Momentum.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSink/Smear.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSink/Point.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSolver/MixedPrecisionRBPrecCG.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSolver/Guesser.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSolver/RBPrecCG.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSolver/A2AVectors.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MGauge/UnitEm.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MGauge/StoutSmearing.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MGauge/Unit.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MGauge/Random.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MGauge/GaugeFix.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MGauge/FundtoHirep.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MGauge/StochEm.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MNoise/FullVolumeSpinColorDiagonal.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MUtilities/PrecisionCast.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MUtilities/RandomVectors.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MUtilities/TestSeqGamma.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MUtilities/TestSeqConserved.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MLoop/NoiseLoop.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalar/FreeProp.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalar/VPCounterTerms.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalar/ScalarVP.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalar/Scalar.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalar/ChargedProp.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MNPR/Bilinear.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MNPR/Amputate.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MNPR/FourQuark.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MAction/DWF.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MAction/MobiusDWF.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MAction/Wilson.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MAction/WilsonClover.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MAction/ZMobiusDWF.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MAction/ScaledDWF.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/StochFreeField.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/ShiftProbe.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/Div.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/TrMag.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/EMT.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/TwoPoint.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/TrPhi.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/Utils.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/TransProj.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/Grad.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MScalarSUN/TrKinetic.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MIO/LoadEigenPack.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MIO/LoadNersc.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MIO/LoadA2AVectors.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MIO/LoadCosmHol.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MIO/LoadBinary.hpp>
 | 
			
		||||
@@ -1,37 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MAction/MobiusDWF.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MAction/MobiusDWF.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MAction;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MAction::TMobiusDWF<FIMPL>;
 | 
			
		||||
#ifdef GRID_DEFAULT_PRECISION_DOUBLE
 | 
			
		||||
template class Grid::Hadrons::MAction::TMobiusDWF<FIMPLF>;
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,37 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MAction/ScaledDWF.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MAction/ScaledDWF.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MAction;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MAction::TScaledDWF<FIMPL>;
 | 
			
		||||
#ifdef GRID_DEFAULT_PRECISION_DOUBLE
 | 
			
		||||
template class Grid::Hadrons::MAction::TScaledDWF<FIMPLF>;
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MContraction/A2AAslashField.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MContraction/A2AAslashField.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MContraction;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MContraction::TA2AAslashField<FIMPL, PhotonR>;
 | 
			
		||||
@@ -1,250 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MContraction/A2AAslashField.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_MContraction_A2AAslashField_hpp_
 | 
			
		||||
#define Hadrons_MContraction_A2AAslashField_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Hadrons/A2AMatrix.hpp>
 | 
			
		||||
 | 
			
		||||
#ifndef ASF_IO_TYPE
 | 
			
		||||
#define ASF_IO_TYPE ComplexF
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                         A2AAslashField                                 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MContraction)
 | 
			
		||||
 | 
			
		||||
class A2AAslashFieldPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(A2AAslashFieldPar,
 | 
			
		||||
                                    int, cacheBlock,
 | 
			
		||||
                                    int, block,
 | 
			
		||||
                                    std::string, left,
 | 
			
		||||
                                    std::string, right,
 | 
			
		||||
                                    std::string, output,
 | 
			
		||||
                                    std::vector<std::string>, emField);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class A2AAslashFieldMetadata: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(A2AAslashFieldMetadata,
 | 
			
		||||
                                    std::string, emFieldName);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T, typename FImpl>
 | 
			
		||||
class AslashFieldKernel: public A2AKernel<T, typename FImpl::FermionField>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef typename FImpl::FermionField FermionField;
 | 
			
		||||
public:
 | 
			
		||||
    AslashFieldKernel(const std::vector<LatticeComplex> &emB0,
 | 
			
		||||
                      const std::vector<LatticeComplex> &emB1,
 | 
			
		||||
                      GridBase *grid)
 | 
			
		||||
    : emB0_(emB0), emB1_(emB1), grid_(grid)
 | 
			
		||||
    {
 | 
			
		||||
        vol_ = 1.;
 | 
			
		||||
        for (auto &d: grid_->GlobalDimensions())
 | 
			
		||||
        {
 | 
			
		||||
            vol_ *= d;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~AslashFieldKernel(void) = default;
 | 
			
		||||
    virtual void operator()(A2AMatrixSet<T> &m, const FermionField *left, 
 | 
			
		||||
                            const FermionField *right,
 | 
			
		||||
                            const unsigned int orthogDim, double &t)
 | 
			
		||||
    {
 | 
			
		||||
        A2Autils<FImpl>::AslashField(m, left, right, emB0_, emB1_, orthogDim, &t);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual double flops(const unsigned int blockSizei, const unsigned int blockSizej)
 | 
			
		||||
    {
 | 
			
		||||
        return 0.;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual double bytes(const unsigned int blockSizei, const unsigned int blockSizej)
 | 
			
		||||
    {
 | 
			
		||||
        return 0.;
 | 
			
		||||
    }
 | 
			
		||||
private:
 | 
			
		||||
    const std::vector<LatticeComplex> &emB0_, &emB1_;
 | 
			
		||||
    GridBase                          *grid_;
 | 
			
		||||
    double                            vol_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl, typename PhotonImpl>
 | 
			
		||||
class TA2AAslashField: public Module<A2AAslashFieldPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
    typedef typename PhotonImpl::GaugeField EmField;
 | 
			
		||||
    typedef A2AMatrixBlockComputation<Complex, 
 | 
			
		||||
                                      FermionField, 
 | 
			
		||||
                                      A2AAslashFieldMetadata, 
 | 
			
		||||
                                      ASF_IO_TYPE> Computation;
 | 
			
		||||
    typedef AslashFieldKernel<Complex, FImpl> Kernel;
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TA2AAslashField(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TA2AAslashField(void) {};
 | 
			
		||||
    // 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_TMP(A2AAslashField, ARG(TA2AAslashField<FIMPL, PhotonR>), MContraction);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                 TA2AAslashField implementation                             *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl, typename PhotonImpl>
 | 
			
		||||
TA2AAslashField<FImpl, PhotonImpl>::TA2AAslashField(const std::string name)
 | 
			
		||||
: Module<A2AAslashFieldPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl, typename PhotonImpl>
 | 
			
		||||
std::vector<std::string> TA2AAslashField<FImpl, PhotonImpl>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in = par().emField;
 | 
			
		||||
    
 | 
			
		||||
    in.push_back(par().left);
 | 
			
		||||
    in.push_back(par().right);
 | 
			
		||||
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl, typename PhotonImpl>
 | 
			
		||||
std::vector<std::string> TA2AAslashField<FImpl, PhotonImpl>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {};
 | 
			
		||||
    
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl, typename PhotonImpl>
 | 
			
		||||
void TA2AAslashField<FImpl, PhotonImpl>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    envTmp(Computation, "computation", 1, envGetGrid(FermionField), 
 | 
			
		||||
           env().getNd() - 1, par().emField.size(), 1, par().block, 
 | 
			
		||||
           par().cacheBlock, this);
 | 
			
		||||
    envTmp(std::vector<ComplexField>, "B0", 1, 
 | 
			
		||||
           par().emField.size(), envGetGrid(ComplexField));
 | 
			
		||||
    envTmp(std::vector<ComplexField>, "B1", 1, 
 | 
			
		||||
           par().emField.size(), envGetGrid(ComplexField));
 | 
			
		||||
    envTmpLat(ComplexField, "Amu");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl, typename PhotonImpl>
 | 
			
		||||
void TA2AAslashField<FImpl, PhotonImpl>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    auto &left  = envGet(std::vector<FermionField>, par().left);
 | 
			
		||||
    auto &right = envGet(std::vector<FermionField>, par().right);
 | 
			
		||||
 | 
			
		||||
    int nt         = env().getDim().back();
 | 
			
		||||
    int N_i        = left.size();
 | 
			
		||||
    int N_j        = right.size();
 | 
			
		||||
    int nem        = par().emField.size();
 | 
			
		||||
    int block      = par().block;
 | 
			
		||||
    int cacheBlock = par().cacheBlock;
 | 
			
		||||
 | 
			
		||||
    LOG(Message) << "Computing all-to-all A-slash fields" << std::endl;
 | 
			
		||||
    LOG(Message) << "Left: '" << par().left << "' Right: '" << par().right << "'" << std::endl;
 | 
			
		||||
    LOG(Message) << "EM fields:" << std::endl;
 | 
			
		||||
    for (auto &name: par().emField)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(Message) << "  " << name << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    LOG(Message) << "A-slash field size: " << nt << "*" << N_i << "*" << N_j 
 | 
			
		||||
                 << " (filesize " << sizeString(nt*N_i*N_j*sizeof(ASF_IO_TYPE)) 
 | 
			
		||||
                 << "/EM field)" << std::endl;
 | 
			
		||||
    
 | 
			
		||||
    // preparing "B" complexified fields
 | 
			
		||||
    startTimer("Complexify EM fields");
 | 
			
		||||
    envGetTmp(std::vector<ComplexField>, B0);
 | 
			
		||||
    envGetTmp(std::vector<ComplexField>, B1);
 | 
			
		||||
    for (unsigned int i = 0; i < par().emField.size(); ++i)
 | 
			
		||||
    {
 | 
			
		||||
        auto &A = envGet(EmField, par().emField[i]);
 | 
			
		||||
        envGetTmp(ComplexField, Amu);
 | 
			
		||||
 | 
			
		||||
        B0[i]  = peekLorentz(A, 0);
 | 
			
		||||
        B0[i] += timesI(peekLorentz(A, 1));
 | 
			
		||||
        B1[i]  = peekLorentz(A, 2);
 | 
			
		||||
        B1[i] += timesI(peekLorentz(A, 3));
 | 
			
		||||
    }
 | 
			
		||||
    stopTimer("Complexify EM fields");
 | 
			
		||||
 | 
			
		||||
    // I/O name & metadata lambdas
 | 
			
		||||
    auto ionameFn = [this](const unsigned int em, const unsigned int dummy)
 | 
			
		||||
    {
 | 
			
		||||
        return par().emField[em];
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    auto filenameFn = [this, &ionameFn](const unsigned int em, const unsigned int dummy)
 | 
			
		||||
    {
 | 
			
		||||
        return par().output + "." + std::to_string(vm().getTrajectory()) 
 | 
			
		||||
               + "/" + ionameFn(em, dummy) + ".h5";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    auto metadataFn = [this](const unsigned int em, const unsigned int dummy)
 | 
			
		||||
    {
 | 
			
		||||
        A2AAslashFieldMetadata md;
 | 
			
		||||
 | 
			
		||||
        md.emFieldName = par().emField[em];
 | 
			
		||||
        
 | 
			
		||||
        return md;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // executing computation
 | 
			
		||||
    Kernel kernel(B0, B1, envGetGrid(FermionField));
 | 
			
		||||
 | 
			
		||||
    envGetTmp(Computation, computation);
 | 
			
		||||
    computation.execute(left, right, kernel, ionameFn, filenameFn, metadataFn);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MContraction_A2AAslashField_hpp_
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MContraction/A2AMesonField.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
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 <Hadrons/Modules/MContraction/A2AMesonField.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MContraction;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MContraction::TA2AMesonField<FIMPL>;
 | 
			
		||||
@@ -1,319 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MContraction/A2AMesonField.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
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 */
 | 
			
		||||
#ifndef Hadrons_MContraction_A2AMesonField_hpp_
 | 
			
		||||
#define Hadrons_MContraction_A2AMesonField_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Hadrons/A2AMatrix.hpp>
 | 
			
		||||
 | 
			
		||||
#ifndef MF_IO_TYPE
 | 
			
		||||
#define MF_IO_TYPE ComplexF
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                     All-to-all meson field creation                        *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MContraction)
 | 
			
		||||
 | 
			
		||||
class A2AMesonFieldPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonFieldPar,
 | 
			
		||||
                                    int, cacheBlock,
 | 
			
		||||
                                    int, block,
 | 
			
		||||
                                    std::string, left,
 | 
			
		||||
                                    std::string, right,
 | 
			
		||||
                                    std::string, output,
 | 
			
		||||
                                    std::string, gammas,
 | 
			
		||||
                                    std::vector<std::string>, mom);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class A2AMesonFieldMetadata: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonFieldMetadata,
 | 
			
		||||
                                    std::vector<RealF>, momentum,
 | 
			
		||||
                                    Gamma::Algebra, gamma);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T, typename FImpl>
 | 
			
		||||
class MesonFieldKernel: public A2AKernel<T, typename FImpl::FermionField>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef typename FImpl::FermionField FermionField;
 | 
			
		||||
public:
 | 
			
		||||
    MesonFieldKernel(const std::vector<Gamma::Algebra> &gamma,
 | 
			
		||||
                     const std::vector<LatticeComplex> &mom,
 | 
			
		||||
                     GridBase *grid)
 | 
			
		||||
    : gamma_(gamma), mom_(mom), grid_(grid)
 | 
			
		||||
    {
 | 
			
		||||
        vol_ = 1.;
 | 
			
		||||
        for (auto &d: grid_->GlobalDimensions())
 | 
			
		||||
        {
 | 
			
		||||
            vol_ *= d;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~MesonFieldKernel(void) = default;
 | 
			
		||||
    virtual void operator()(A2AMatrixSet<T> &m, const FermionField *left, 
 | 
			
		||||
                            const FermionField *right,
 | 
			
		||||
                            const unsigned int orthogDim, double &t)
 | 
			
		||||
    {
 | 
			
		||||
        A2Autils<FImpl>::MesonField(m, left, right, gamma_, mom_, orthogDim, &t);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual double flops(const unsigned int blockSizei, const unsigned int blockSizej)
 | 
			
		||||
    {
 | 
			
		||||
        return vol_*(2*8.0+6.0+8.0*mom_.size())*blockSizei*blockSizej*gamma_.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual double bytes(const unsigned int blockSizei, const unsigned int blockSizej)
 | 
			
		||||
    {
 | 
			
		||||
        return vol_*(12.0*sizeof(T))*blockSizei*blockSizej
 | 
			
		||||
               +  vol_*(2.0*sizeof(T)*mom_.size())*blockSizei*blockSizej*gamma_.size();
 | 
			
		||||
    }
 | 
			
		||||
private:
 | 
			
		||||
    const std::vector<Gamma::Algebra> &gamma_;
 | 
			
		||||
    const std::vector<LatticeComplex> &mom_;
 | 
			
		||||
    GridBase                          *grid_;
 | 
			
		||||
    double                            vol_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TA2AMesonField : public Module<A2AMesonFieldPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
    typedef A2AMatrixBlockComputation<Complex, 
 | 
			
		||||
                                      FermionField, 
 | 
			
		||||
                                      A2AMesonFieldMetadata, 
 | 
			
		||||
                                      MF_IO_TYPE> Computation;
 | 
			
		||||
    typedef MesonFieldKernel<Complex, FImpl> Kernel;
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TA2AMesonField(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TA2AMesonField(void){};
 | 
			
		||||
    // 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);
 | 
			
		||||
private:
 | 
			
		||||
    bool                               hasPhase_{false};
 | 
			
		||||
    std::string                        momphName_;
 | 
			
		||||
    std::vector<Gamma::Algebra>        gamma_;
 | 
			
		||||
    std::vector<std::vector<Real>>     mom_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER(A2AMesonField, ARG(TA2AMesonField<FIMPL>), MContraction);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
*                  TA2AMesonField implementation                             *
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
TA2AMesonField<FImpl>::TA2AMesonField(const std::string name)
 | 
			
		||||
: Module<A2AMesonFieldPar>(name)
 | 
			
		||||
, momphName_(name + "_momph")
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TA2AMesonField<FImpl>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in = {par().left, par().right};
 | 
			
		||||
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TA2AMesonField<FImpl>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {};
 | 
			
		||||
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TA2AMesonField<FImpl>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    gamma_.clear();
 | 
			
		||||
    mom_.clear();
 | 
			
		||||
    if (par().gammas == "all")
 | 
			
		||||
    {
 | 
			
		||||
        gamma_ = {
 | 
			
		||||
            Gamma::Algebra::Gamma5,
 | 
			
		||||
            Gamma::Algebra::Identity,    
 | 
			
		||||
            Gamma::Algebra::GammaX,
 | 
			
		||||
            Gamma::Algebra::GammaY,
 | 
			
		||||
            Gamma::Algebra::GammaZ,
 | 
			
		||||
            Gamma::Algebra::GammaT,
 | 
			
		||||
            Gamma::Algebra::GammaXGamma5,
 | 
			
		||||
            Gamma::Algebra::GammaYGamma5,
 | 
			
		||||
            Gamma::Algebra::GammaZGamma5,
 | 
			
		||||
            Gamma::Algebra::GammaTGamma5,
 | 
			
		||||
            Gamma::Algebra::SigmaXY,
 | 
			
		||||
            Gamma::Algebra::SigmaXZ,
 | 
			
		||||
            Gamma::Algebra::SigmaXT,
 | 
			
		||||
            Gamma::Algebra::SigmaYZ,
 | 
			
		||||
            Gamma::Algebra::SigmaYT,
 | 
			
		||||
            Gamma::Algebra::SigmaZT
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        gamma_ = strToVec<Gamma::Algebra>(par().gammas);
 | 
			
		||||
    }
 | 
			
		||||
    for (auto &pstr: par().mom)
 | 
			
		||||
    {
 | 
			
		||||
        auto p = strToVec<Real>(pstr);
 | 
			
		||||
 | 
			
		||||
        if (p.size() != env().getNd() - 1)
 | 
			
		||||
        {
 | 
			
		||||
            HADRONS_ERROR(Size, "Momentum has " + std::to_string(p.size())
 | 
			
		||||
                                + " components instead of " 
 | 
			
		||||
                                + std::to_string(env().getNd() - 1));
 | 
			
		||||
        }
 | 
			
		||||
        mom_.push_back(p);
 | 
			
		||||
    }
 | 
			
		||||
    envCache(std::vector<ComplexField>, momphName_, 1, 
 | 
			
		||||
             par().mom.size(), envGetGrid(ComplexField));
 | 
			
		||||
    envTmpLat(ComplexField, "coor");
 | 
			
		||||
    envTmp(Computation, "computation", 1, envGetGrid(FermionField), 
 | 
			
		||||
           env().getNd() - 1, mom_.size(), gamma_.size(), par().block, 
 | 
			
		||||
           par().cacheBlock, this);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TA2AMesonField<FImpl>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    auto &left  = envGet(std::vector<FermionField>, par().left);
 | 
			
		||||
    auto &right = envGet(std::vector<FermionField>, par().right);
 | 
			
		||||
 | 
			
		||||
    int nt         = env().getDim().back();
 | 
			
		||||
    int N_i        = left.size();
 | 
			
		||||
    int N_j        = right.size();
 | 
			
		||||
    int ngamma     = gamma_.size();
 | 
			
		||||
    int nmom       = mom_.size();
 | 
			
		||||
    int block      = par().block;
 | 
			
		||||
    int cacheBlock = par().cacheBlock;
 | 
			
		||||
 | 
			
		||||
    LOG(Message) << "Computing all-to-all meson fields" << std::endl;
 | 
			
		||||
    LOG(Message) << "Left: '" << par().left << "' Right: '" << par().right << "'" << std::endl;
 | 
			
		||||
    LOG(Message) << "Momenta:" << std::endl;
 | 
			
		||||
    for (auto &p: mom_)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(Message) << "  " << p << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    LOG(Message) << "Spin bilinears:" << std::endl;
 | 
			
		||||
    for (auto &g: gamma_)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(Message) << "  " << g << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    LOG(Message) << "Meson field size: " << nt << "*" << N_i << "*" << N_j 
 | 
			
		||||
                 << " (filesize " << sizeString(nt*N_i*N_j*sizeof(MF_IO_TYPE)) 
 | 
			
		||||
                 << "/momentum/bilinear)" << std::endl;
 | 
			
		||||
 | 
			
		||||
    auto &ph = envGet(std::vector<ComplexField>, momphName_);
 | 
			
		||||
 | 
			
		||||
    if (!hasPhase_)
 | 
			
		||||
    {
 | 
			
		||||
        startTimer("Momentum phases");
 | 
			
		||||
        for (unsigned int j = 0; j < nmom; ++j)
 | 
			
		||||
        {
 | 
			
		||||
            Complex           i(0.0,1.0);
 | 
			
		||||
            std::vector<Real> p;
 | 
			
		||||
 | 
			
		||||
            envGetTmp(ComplexField, coor);
 | 
			
		||||
            ph[j] = zero;
 | 
			
		||||
            for(unsigned int mu = 0; mu < mom_[j].size(); mu++)
 | 
			
		||||
            {
 | 
			
		||||
                LatticeCoordinate(coor, mu);
 | 
			
		||||
                ph[j] = ph[j] + (mom_[j][mu]/env().getDim(mu))*coor;
 | 
			
		||||
            }
 | 
			
		||||
            ph[j] = exp((Real)(2*M_PI)*i*ph[j]);
 | 
			
		||||
        }
 | 
			
		||||
        hasPhase_ = true;
 | 
			
		||||
        stopTimer("Momentum phases");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto ionameFn = [this](const unsigned int m, const unsigned int g)
 | 
			
		||||
    {
 | 
			
		||||
        std::stringstream ss;
 | 
			
		||||
 | 
			
		||||
        ss << gamma_[g] << "_";
 | 
			
		||||
        for (unsigned int mu = 0; mu < mom_[m].size(); ++mu)
 | 
			
		||||
        {
 | 
			
		||||
            ss << mom_[m][mu] << ((mu == mom_[m].size() - 1) ? "" : "_");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ss.str();
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    auto filenameFn = [this, &ionameFn](const unsigned int m, const unsigned int g)
 | 
			
		||||
    {
 | 
			
		||||
        return par().output + "." + std::to_string(vm().getTrajectory()) 
 | 
			
		||||
               + "/" + ionameFn(m, g) + ".h5";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    auto metadataFn = [this](const unsigned int m, const unsigned int g)
 | 
			
		||||
    {
 | 
			
		||||
        A2AMesonFieldMetadata md;
 | 
			
		||||
 | 
			
		||||
        for (auto pmu: mom_[m])
 | 
			
		||||
        {
 | 
			
		||||
            md.momentum.push_back(pmu);
 | 
			
		||||
        }
 | 
			
		||||
        md.gamma = gamma_[g];
 | 
			
		||||
        
 | 
			
		||||
        return md;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    Kernel      kernel(gamma_, ph, envGetGrid(FermionField));
 | 
			
		||||
 | 
			
		||||
    envGetTmp(Computation, computation);
 | 
			
		||||
    computation.execute(left, right, kernel, ionameFn, filenameFn, metadataFn);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MContraction_A2AMesonField_hpp_
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MGauge/GaugeFix.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
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 */
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Modules/MGauge/GaugeFix.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MGauge;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MGauge::TGaugeFix<GIMPL>;
 | 
			
		||||
@@ -1,135 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MGauge/GaugeFix.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
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 Hadrons_MGaugeFix_hpp_
 | 
			
		||||
#define Hadrons_MGaugeFix_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Grid/qcd/utils/GaugeFix.h>
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                              Fix gauge                                    *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MGauge)
 | 
			
		||||
 | 
			
		||||
class GaugeFixPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(GaugeFixPar,
 | 
			
		||||
                                    std::string, gauge,
 | 
			
		||||
                                    Real,  alpha,
 | 
			
		||||
                                    int, maxiter, 
 | 
			
		||||
                                    Real, Omega_tol, 
 | 
			
		||||
                                    Real, Phi_tol,
 | 
			
		||||
                                    bool, Fourier);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename GImpl>
 | 
			
		||||
class TGaugeFix: public Module<GaugeFixPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GAUGE_TYPE_ALIASES(GImpl,);
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TGaugeFix(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TGaugeFix(void) {};
 | 
			
		||||
    // 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_TMP(GaugeFix, TGaugeFix<GIMPL>, MGauge);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
*                            TGaugeFix implementation                             *
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename GImpl>
 | 
			
		||||
TGaugeFix<GImpl>::TGaugeFix(const std::string name)
 | 
			
		||||
: Module<GaugeFixPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename GImpl>
 | 
			
		||||
std::vector<std::string> TGaugeFix<GImpl>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in = {par().gauge};
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename GImpl>
 | 
			
		||||
std::vector<std::string> TGaugeFix<GImpl>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName()};
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename GImpl>
 | 
			
		||||
void TGaugeFix<GImpl>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    envCreateLat(GaugeField, getName());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename GImpl>
 | 
			
		||||
void TGaugeFix<GImpl>::execute(void)
 | 
			
		||||
//Loads the gauge and fixes it
 | 
			
		||||
{
 | 
			
		||||
    std::cout << "executing" << std::endl;
 | 
			
		||||
    LOG(Message) << "Fixing the Gauge" << std::endl;
 | 
			
		||||
    LOG(Message) << par().gauge << std::endl;
 | 
			
		||||
    auto &U     = envGet(GaugeField, par().gauge);
 | 
			
		||||
    auto &Umu   = envGet(GaugeField, getName());
 | 
			
		||||
    LOG(Message) << "Gauge Field fetched" << std::endl;
 | 
			
		||||
    //do we allow maxiter etc to be user set?
 | 
			
		||||
    Real alpha     = par().alpha;
 | 
			
		||||
    int  maxiter   = par().maxiter;
 | 
			
		||||
    Real Omega_tol = par().Omega_tol;
 | 
			
		||||
    Real Phi_tol   = par().Phi_tol;
 | 
			
		||||
    bool Fourier   = par().Fourier;
 | 
			
		||||
    FourierAcceleratedGaugeFixer<PeriodicGimplR>::SteepestDescentGaugeFix(U,alpha,maxiter,Omega_tol,Phi_tol,Fourier);
 | 
			
		||||
    Umu = U;
 | 
			
		||||
    LOG(Message) << "Gauge Fixed" << std::endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MGaugeFix_hpp_
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MGauge/Random.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MGauge/Random.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MGauge;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MGauge::TRandom<GIMPL>;
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MGauge/StoutSmearing.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MGauge/StoutSmearing.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MGauge;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MGauge::TStoutSmearing<GIMPL>;
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MGauge/Unit.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MGauge/Unit.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MGauge;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MGauge::TUnit<GIMPL>;
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MIO/LoadA2AVectors.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MIO/LoadA2AVectors.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MIO;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MIO::TLoadA2AVectors<FIMPL>;
 | 
			
		||||
@@ -1,120 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MIO/LoadA2AVectors.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_MIO_LoadA2AVectors_hpp_
 | 
			
		||||
#define Hadrons_MIO_LoadA2AVectors_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Hadrons/A2AVectors.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                    Module to load all-to-all vectors                       *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MIO)
 | 
			
		||||
 | 
			
		||||
class LoadA2AVectorsPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(LoadA2AVectorsPar,
 | 
			
		||||
                                    std::string,  filestem,
 | 
			
		||||
                                    bool,         multiFile,
 | 
			
		||||
                                    unsigned int, size);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TLoadA2AVectors: public Module<LoadA2AVectorsPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TLoadA2AVectors(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TLoadA2AVectors(void) {};
 | 
			
		||||
    // 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_TMP(LoadA2AVectors, TLoadA2AVectors<FIMPL>, MIO);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                      TLoadA2AVectors implementation                        *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
TLoadA2AVectors<FImpl>::TLoadA2AVectors(const std::string name)
 | 
			
		||||
: Module<LoadA2AVectorsPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TLoadA2AVectors<FImpl>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in;
 | 
			
		||||
    
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TLoadA2AVectors<FImpl>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName()};
 | 
			
		||||
    
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TLoadA2AVectors<FImpl>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    envCreate(std::vector<FermionField>, getName(), 1, par().size, 
 | 
			
		||||
              envGetGrid(FermionField));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TLoadA2AVectors<FImpl>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    auto &vec = envGet(std::vector<FermionField>, getName());
 | 
			
		||||
 | 
			
		||||
    A2AVectorsIo::read(vec, par().filestem, par().multiFile, vm().getTrajectory());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MIO_LoadA2AVectors_hpp_
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MIO/LoadCosmHol.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MIO/LoadCosmHol.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MIO;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MIO::TLoadCosmHol<ScalarNxNAdjImplR<2>>;
 | 
			
		||||
template class Grid::Hadrons::MIO::TLoadCosmHol<ScalarNxNAdjImplR<3>>;
 | 
			
		||||
template class Grid::Hadrons::MIO::TLoadCosmHol<ScalarNxNAdjImplR<4>>;
 | 
			
		||||
template class Grid::Hadrons::MIO::TLoadCosmHol<ScalarNxNAdjImplR<5>>;
 | 
			
		||||
template class Grid::Hadrons::MIO::TLoadCosmHol<ScalarNxNAdjImplR<6>>;
 | 
			
		||||
@@ -1,146 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MIO/LoadCosmHol.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_MIO_LoadCosmHol_hpp_
 | 
			
		||||
#define Hadrons_MIO_LoadCosmHol_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                    Load scalar SU(N) configurations                        *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MIO)
 | 
			
		||||
 | 
			
		||||
class LoadCosmHolPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(LoadCosmHolPar,
 | 
			
		||||
                                    std::string, file);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ScalarActionParameters: Serializable 
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(ScalarActionParameters,
 | 
			
		||||
                                    double, mass_squared,
 | 
			
		||||
                                    double, lambda,
 | 
			
		||||
                                    double, g);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename SImpl>
 | 
			
		||||
class TLoadCosmHol: public Module<LoadCosmHolPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef typename SImpl::Field Field;
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TLoadCosmHol(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TLoadCosmHol(void) {};
 | 
			
		||||
    // 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_TMP(LoadCosmHolSU2, TLoadCosmHol<ScalarNxNAdjImplR<2>>, MIO);
 | 
			
		||||
MODULE_REGISTER_TMP(LoadCosmHolSU3, TLoadCosmHol<ScalarNxNAdjImplR<3>>, MIO);
 | 
			
		||||
MODULE_REGISTER_TMP(LoadCosmHolSU4, TLoadCosmHol<ScalarNxNAdjImplR<4>>, MIO);
 | 
			
		||||
MODULE_REGISTER_TMP(LoadCosmHolSU5, TLoadCosmHol<ScalarNxNAdjImplR<5>>, MIO);
 | 
			
		||||
MODULE_REGISTER_TMP(LoadCosmHolSU6, TLoadCosmHol<ScalarNxNAdjImplR<6>>, MIO);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                       TLoadCosmHol implementation                          *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename SImpl>
 | 
			
		||||
TLoadCosmHol<SImpl>::TLoadCosmHol(const std::string name)
 | 
			
		||||
: Module<LoadCosmHolPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename SImpl>
 | 
			
		||||
std::vector<std::string> TLoadCosmHol<SImpl>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in;
 | 
			
		||||
    
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename SImpl>
 | 
			
		||||
std::vector<std::string> TLoadCosmHol<SImpl>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName()};
 | 
			
		||||
    
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename SImpl>
 | 
			
		||||
void TLoadCosmHol<SImpl>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    envCreateLat(Field, getName());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename SImpl>
 | 
			
		||||
void TLoadCosmHol<SImpl>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    ScalarActionParameters    md;
 | 
			
		||||
    std::string        filename = par().file + "."
 | 
			
		||||
                                  + std::to_string(vm().getTrajectory());
 | 
			
		||||
    ScidacReader       reader;
 | 
			
		||||
    const unsigned int N    = SImpl::Group::Dimension;
 | 
			
		||||
    auto               &phi = envGet(Field, getName());
 | 
			
		||||
 | 
			
		||||
    LOG(Message) << "Loading CosmHol configuration from file '" << filename
 | 
			
		||||
                 << "'" << std::endl;
 | 
			
		||||
    reader.open(filename);
 | 
			
		||||
    reader.readScidacFieldRecord(phi, md);
 | 
			
		||||
    reader.close();
 | 
			
		||||
    LOG(Message) << "tr(phi^2) = " 
 | 
			
		||||
                 << -TensorRemove(sum(trace(phi*phi))).real()/env().getVolume() 
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
    LOG(Message) << "Configuration parameters:" << std::endl;
 | 
			
		||||
    LOG(Message) << "     N = " << N << std::endl;
 | 
			
		||||
    LOG(Message) << "   m^2 = " << md.mass_squared << std::endl;
 | 
			
		||||
    LOG(Message) << "lambda = " << md.lambda << std::endl;
 | 
			
		||||
    LOG(Message) << "     g = " << md.g << std::endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MIO_LoadCosmHol_hpp_
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MIO/LoadNersc.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MIO/LoadNersc.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MIO;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MIO::TLoadNersc<GIMPL>;
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MNPR/Amputate.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
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 */
 | 
			
		||||
#include <Hadrons/Modules/MNPR/Amputate.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MNPR;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MNPR::TAmputate<FIMPL,FIMPL>;
 | 
			
		||||
 | 
			
		||||
@@ -1,200 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MNPR/Amputate.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
Author: Julia Kettle J.R.Kettle-2@sms.ed.ac.uk
 | 
			
		||||
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 Hadrons_Amputate_hpp_
 | 
			
		||||
#define Hadrons_Amputate_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Grid/Eigen/LU>
 | 
			
		||||
//#include <Grid/qcd/utils/PropagatorUtils.h>
 | 
			
		||||
//#include <Grid/serialisation/Serialisation.h>
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                                TAmputate                                       *
 | 
			
		||||
        Performs bilinear contractions of the type tr[g5*adj(Sout)*g5*G*Sin]
 | 
			
		||||
        Suitable for non exceptional momenta
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MNPR)
 | 
			
		||||
 | 
			
		||||
class AmputatePar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(AmputatePar,
 | 
			
		||||
                                    std::string,    Sin, //need to make this a propogator type?
 | 
			
		||||
                                    std::string,    Sout, //same
 | 
			
		||||
                                    std::string,    vertex,
 | 
			
		||||
                                    std::string,    pin,
 | 
			
		||||
                                    std::string,    pout,
 | 
			
		||||
                                    std::string,    output,
 | 
			
		||||
                                    std::string,    input);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
class TAmputate: public Module<AmputatePar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl1, 1);
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl2, 2);
 | 
			
		||||
    class Result: Serializable
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        GRID_SERIALIZABLE_CLASS_MEMBERS(Result,
 | 
			
		||||
                                        std::vector<Complex>, Vamp,
 | 
			
		||||
                                        ); 
 | 
			
		||||
    };
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TAmputate(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TAmputate(void) {};
 | 
			
		||||
    // dependencies/products
 | 
			
		||||
    virtual std::vector<std::string> getInput(void);
 | 
			
		||||
    virtual std::vector<std::string> getOutput(void);
 | 
			
		||||
    virtual SpinColourMatrix invertspincolmat(SpinColourMatrix &scmat);
 | 
			
		||||
    // execution
 | 
			
		||||
    virtual void execute(void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER_TMP(Amputate, ARG(TAmputate<FIMPL, FIMPL>), MNPR);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                           TAmputate implementation                            *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
TAmputate<FImpl1, FImpl2>::TAmputate(const std::string name)
 | 
			
		||||
: Module<AmputatePar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
std::vector<std::string> TAmputate<FImpl1, FImpl2>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> input = {par().Sin, par().Sout, par().vertex};
 | 
			
		||||
    
 | 
			
		||||
    return input;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
std::vector<std::string> TAmputate<FImpl1, FImpl2>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> output = {getName()};
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    return output;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Invert spin colour matrix using Eigen
 | 
			
		||||
template <typename Fimpl1, typename Fimpl2>
 | 
			
		||||
SpinColourMatrix TAmputate<Fimpl1, Fimpl2>::invertspincolmat(SpinColourMatrix &scmat)
 | 
			
		||||
{
 | 
			
		||||
    Eigen::MatrixXcf scmat_2d(Ns*Nc,Ns*Nc);
 | 
			
		||||
    for(int ic=0; ic<Nc; ic++){
 | 
			
		||||
    for(int jc=0; jc<Nc; jc++){
 | 
			
		||||
        for(int is=0; is<Ns; is++){
 | 
			
		||||
        for(int js=0; js<Ns; js++){
 | 
			
		||||
            scmat_2d(Ns*ic+is,Ns*jc+js) = scmat()(is,js)(ic,jc);
 | 
			
		||||
        }}
 | 
			
		||||
    }}      
 | 
			
		||||
    Eigen::MatrixXcf scmat_2d_inv = scmat_2d.inverse();
 | 
			
		||||
    SpinColourMatrix scmat_inv;
 | 
			
		||||
    for(int ic=0; ic<Nc; ic++){
 | 
			
		||||
    for(int jc=0; jc<Nc; jc++){
 | 
			
		||||
        for(int is=0; is<Ns; is++){
 | 
			
		||||
        for(int js=0; js<Ns; js++){
 | 
			
		||||
            scmat_inv()(is,js)(ic,jc) = scmat_2d_inv(Ns*ic+is,Ns*jc+js);
 | 
			
		||||
        }}
 | 
			
		||||
    }}      
 | 
			
		||||
    return scmat_inv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
void TAmputate<FImpl1, FImpl2>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    LOG(Message) << "Computing bilinear amputations '" << getName() << "' using"
 | 
			
		||||
                 << " momentum '" << par().Sin << "' and '" << par().Sout << "'"
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
    BinaryWriter                    writer(par().output);
 | 
			
		||||
    PropagatorField1                &Sin = *env().template getObject<PropagatorField1>(par().Sin); //Do these have the phases taken into account?? Don't think so. FIX
 | 
			
		||||
    PropagatorField2                &Sout = *env().template getObject<PropagatorField2>(par().Sout);
 | 
			
		||||
    std::vector<int>                pin  = strToVec<int>(par().pin), pout = strToVec<int>(par().pout);
 | 
			
		||||
    std::vector<Real>               latt_size(pin.begin(), pin.end()); 
 | 
			
		||||
    LatticeComplex                  pdotxin(env().getGrid()), pdotxout(env().getGrid()), coor(env().getGrid());
 | 
			
		||||
    LOG(Message) << "Propagators set up " << std::endl;
 | 
			
		||||
    std::vector<SpinColourMatrix>   vertex; // Let's read from file here
 | 
			
		||||
    Gamma                           g5(Gamma::Algebra::Gamma5);
 | 
			
		||||
    Result                          result;
 | 
			
		||||
    LOG(Message) << "reading file - "  << par().input << std::endl;
 | 
			
		||||
    BinaryReader                    reader(par().input); 
 | 
			
		||||
    Complex                         Ci(0.0,1.0);
 | 
			
		||||
 | 
			
		||||
    std::string svertex;
 | 
			
		||||
    read(reader,"vertex", vertex);
 | 
			
		||||
    LOG(Message) << "vertex read" << std::endl;
 | 
			
		||||
 | 
			
		||||
    pdotxin=zero;
 | 
			
		||||
    pdotxout=zero;
 | 
			
		||||
    for (unsigned int mu = 0; mu < 4; ++mu)
 | 
			
		||||
    {
 | 
			
		||||
        Real TwoPiL =  M_PI * 2.0/ latt_size[mu];
 | 
			
		||||
        LatticeCoordinate(coor,mu);
 | 
			
		||||
        pdotxin = pdotxin +(TwoPiL * pin[mu]) * coor;
 | 
			
		||||
        pdotxout= pdotxout +(TwoPiL * pout[mu]) * coor;
 | 
			
		||||
    }
 | 
			
		||||
    Sin = Sin*exp(-Ci*pdotxin); //phase corrections
 | 
			
		||||
    Sout = Sout*exp(-Ci*pdotxout);
 | 
			
		||||
 | 
			
		||||
    SpinColourMatrix Sin_mom = sum(Sin);
 | 
			
		||||
    SpinColourMatrix Sout_mom = sum(Sout);
 | 
			
		||||
    LOG(Message) << "summed over lattice" << std::endl;
 | 
			
		||||
   
 | 
			
		||||
    LOG(Message) << "Lattice -> spincolourmatrix conversion" << std::endl;
 | 
			
		||||
 | 
			
		||||
    SpinColourMatrix Sin_inv = invertspincolmat(Sin_mom);
 | 
			
		||||
    SpinColourMatrix Sout_inv = invertspincolmat(Sout_mom);
 | 
			
		||||
    LOG(Message) << "Inversions done" << std::endl;
 | 
			
		||||
 | 
			
		||||
    result.Vamp.resize(Gamma::nGamma/2);
 | 
			
		||||
    for( int mu=0; mu < Gamma::nGamma/2; mu++){
 | 
			
		||||
        Gamma::Algebra gam = mu;
 | 
			
		||||
        result.Vamp[mu] = 1/12.0*trace(adj(Gamma(mu*2+1))*g5*Sout_inv*g5*vertex[mu]*Sin_inv);
 | 
			
		||||
        LOG(Message) << "Vamp[" << mu << "] - " << result.Vamp[mu] << std::endl;
 | 
			
		||||
        }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_Amputate_hpp_
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MNPR/Bilinear.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
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 */
 | 
			
		||||
#include <Hadrons/Modules/MNPR/Bilinear.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MNPR;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MNPR::TBilinear<FIMPL,FIMPL>;
 | 
			
		||||
 | 
			
		||||
@@ -1,225 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MNPR/Bilinear.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
Author: Julia Kettle J.R.Kettle-2@sms.ed.ac.uk
 | 
			
		||||
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 Hadrons_Bilinear_hpp_
 | 
			
		||||
#define Hadrons_Bilinear_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
//#include <Grid/qcd/utils/PropagatorUtils.h>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                                TBilinear                                       *
 | 
			
		||||
        Performs bilinear contractions of the type tr[g5*adj(Sout)*g5*G*Sin]
 | 
			
		||||
        Suitable for non exceptional momenta in Rome-Southampton NPR
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MNPR)
 | 
			
		||||
 | 
			
		||||
class BilinearPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(BilinearPar,
 | 
			
		||||
                                    std::string,    Sin,
 | 
			
		||||
                                    std::string,    Sout,
 | 
			
		||||
                                    std::string,    pin,
 | 
			
		||||
                                    std::string,    pout,
 | 
			
		||||
                                    std::string,    output);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
class TBilinear: public Module<BilinearPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl1, 1);
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl2, 2);
 | 
			
		||||
    class Result: Serializable
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        GRID_SERIALIZABLE_CLASS_MEMBERS(Result, 
 | 
			
		||||
                                        std::vector<SpinColourMatrix>, bilinear);
 | 
			
		||||
    };
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TBilinear(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TBilinear(void) {};
 | 
			
		||||
    // dependencies/products
 | 
			
		||||
    virtual std::vector<std::string> getInput(void);
 | 
			
		||||
    virtual std::vector<std::string> getOutput(void);
 | 
			
		||||
    //LatticeSpinColourMatrix PhaseProps(LatticeSpinColourMatrix S, std::vector<Real> p);
 | 
			
		||||
    // setup
 | 
			
		||||
    virtual void setup(void);
 | 
			
		||||
    // execution
 | 
			
		||||
    virtual void execute(void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER_TMP(Bilinear, ARG(TBilinear<FIMPL, FIMPL>), MNPR);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                           TBilinear implementation                            *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
TBilinear<FImpl1, FImpl2>::TBilinear(const std::string name)
 | 
			
		||||
: Module<BilinearPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
void TBilinear<FImpl1, FImpl2>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    //env().template registerLattice<LatticeSpinColourMatrix>(getName());
 | 
			
		||||
    //env().template registerObject<SpinColourMatrix>(getName());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
std::vector<std::string> TBilinear<FImpl1, FImpl2>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> input = {par().Sin, par().Sout};
 | 
			
		||||
    
 | 
			
		||||
    return input;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
std::vector<std::string> TBilinear<FImpl1, FImpl2>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName()};
 | 
			
		||||
    
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
/////Phase propagators//////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
LatticeSpinColourMatrix TBilinear<FImpl1, FImpl2>::PhaseProps(LatticeSpinColourMatrix S, std::vector<Real> p)
 | 
			
		||||
{
 | 
			
		||||
    GridBase *grid = S._grid;
 | 
			
		||||
    LatticeComplex      pdotx(grid),  coor(grid);
 | 
			
		||||
    std::vector<int>   latt_size = grid->_fdimensions; 
 | 
			
		||||
    Complex             Ci(0.0,1.0);
 | 
			
		||||
    pdotx=zero;
 | 
			
		||||
    for (unsigned int mu = 0; mu < 4; ++mu)
 | 
			
		||||
    {
 | 
			
		||||
        Real TwoPiL =  M_PI * 2.0/ latt_size[mu];
 | 
			
		||||
        LatticeCoordinate(coor,mu);
 | 
			
		||||
        pdotx = pdotx +(TwoPiL * p[mu]) * coor;
 | 
			
		||||
    }
 | 
			
		||||
    S = S*exp(-Ci*pdotx);
 | 
			
		||||
    return S;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
void TBilinear<FImpl1, FImpl2>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
/**************************************************************************
 | 
			
		||||
 | 
			
		||||
Compute the bilinear vertex needed for the NPR.
 | 
			
		||||
V(G) = sum_x  [ g5 * adj(S'(x,p2)) * g5 * G * S'(x,p1) ]_{si,sj,ci,cj}
 | 
			
		||||
G is one of the 16 gamma vertices [I,gmu,g5,g5gmu,sig(mu,nu)]
 | 
			
		||||
 | 
			
		||||
        * G
 | 
			
		||||
       / \
 | 
			
		||||
    p1/   \p2
 | 
			
		||||
     /     \
 | 
			
		||||
    /       \
 | 
			
		||||
 | 
			
		||||
Returns a spin-colour matrix, with indices si,sj, ci,cj
 | 
			
		||||
 | 
			
		||||
Conventions:
 | 
			
		||||
p1 - incoming momenta
 | 
			
		||||
p2 - outgoing momenta
 | 
			
		||||
q = (p1-p2)
 | 
			
		||||
**************************************************************************/
 | 
			
		||||
 | 
			
		||||
    LOG(Message) << "Computing bilinear contractions '" << getName() << "' using"
 | 
			
		||||
                 << " momentum '" << par().Sin << "' and '" << par().Sout << "'"
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
     
 | 
			
		||||
    BinaryWriter             writer(par().output);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Propogators
 | 
			
		||||
    LatticeSpinColourMatrix     &Sin = *env().template getObject<LatticeSpinColourMatrix>(par().Sin);
 | 
			
		||||
    LatticeSpinColourMatrix     &Sout = *env().template getObject<LatticeSpinColourMatrix>(par().Sout);
 | 
			
		||||
    LatticeComplex              pdotxin(env().getGrid()), pdotxout(env().getGrid()), coor(env().getGrid());
 | 
			
		||||
    // momentum on legs
 | 
			
		||||
    std::vector<Real>           pin  = strToVec<Real>(par().pin), pout = strToVec<Real>(par().pout);
 | 
			
		||||
    std::vector<Real>           latt_size(pin.begin(), pin.end()); 
 | 
			
		||||
    //bilinears
 | 
			
		||||
    LatticeSpinColourMatrix     bilinear_x(env().getGrid());
 | 
			
		||||
    SpinColourMatrix            bilinear;
 | 
			
		||||
    Gamma                       g5(Gamma::Algebra::Gamma5);
 | 
			
		||||
    Result                      result;
 | 
			
		||||
    Complex                     Ci(0.0,1.0);
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    pdotxin=zero;
 | 
			
		||||
    pdotxout=zero;
 | 
			
		||||
    for (unsigned int mu = 0; mu < 4; ++mu)
 | 
			
		||||
    {
 | 
			
		||||
        Real TwoPiL =  M_PI * 2.0/ latt_size[mu];
 | 
			
		||||
        LatticeCoordinate(coor,mu);
 | 
			
		||||
        pdotxin = pdotxin +(TwoPiL * pin[mu]) * coor;
 | 
			
		||||
        pdotxout= pdotxout +(TwoPiL * pout[mu]) * coor;
 | 
			
		||||
    }
 | 
			
		||||
    Sin = Sin*exp(-Ci*pdotxin); //phase corrections
 | 
			
		||||
    Sout = Sout*exp(-Ci*pdotxout);
 | 
			
		||||
    
 | 
			
		||||
    ////Set up gamma vector//////////////////////////
 | 
			
		||||
    std::vector<Gamma> gammavector;
 | 
			
		||||
    for( int i=0; i<Gamma::nGamma; i++){
 | 
			
		||||
        Gamma::Algebra gam = i;
 | 
			
		||||
        gammavector.push_back(Gamma(gam));
 | 
			
		||||
    }
 | 
			
		||||
    result.bilinear.resize(Gamma::nGamma);
 | 
			
		||||
    /////////////////////////////////////////////////
 | 
			
		||||
    //LatticeSpinMatrix temp = g5*Sout;
 | 
			
		||||
    ////////Form Vertex//////////////////////////////
 | 
			
		||||
    for (int i=0; i < Gamma::nGamma; i++){
 | 
			
		||||
        bilinear_x = g5*adj(Sout)*g5*gammavector[i]*Sin; 
 | 
			
		||||
        result.bilinear[i] = sum(bilinear_x); //sum over lattice sites
 | 
			
		||||
    }
 | 
			
		||||
    //////////////////////////////////////////////////
 | 
			
		||||
    write(writer, par().output, result.bilinear);
 | 
			
		||||
    LOG(Message) << "Complete. Writing results to " << par().output << std:: endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_Bilinear_hpp_
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MNPR/FourQuark.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
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 */
 | 
			
		||||
#include <Hadrons/Modules/MNPR/FourQuark.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MNPR;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MNPR::TFourQuark<FIMPL,FIMPL>;
 | 
			
		||||
 | 
			
		||||
@@ -1,274 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MNPR/FourQuark.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
Author: Julia Kettle J.R.Kettle-2@sms.ed.ac.uk
 | 
			
		||||
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 Hadrons_FourQuark_hpp_
 | 
			
		||||
#define Hadrons_FourQuark_hpp_
 | 
			
		||||
 | 
			
		||||
#include <typeinfo>
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Grid/serialisation/Serialisation.h>
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                                TFourQuark                                       *
 | 
			
		||||
        Performs fourquark contractions of the type tr[g5*adj(Sout)*g5*G*Sin]
 | 
			
		||||
        Suitable for non exceptional momenta
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MNPR)
 | 
			
		||||
 | 
			
		||||
class FourQuarkPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(FourQuarkPar,
 | 
			
		||||
                                    std::string,    Sin, //need to make this a propogator type?
 | 
			
		||||
                                    std::string,    Sout, //same
 | 
			
		||||
                                    std::string,    pin,
 | 
			
		||||
                                    std::string,    pout,
 | 
			
		||||
                                    bool,           fullbasis,
 | 
			
		||||
                                    std::string,    output);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
class TFourQuark: public Module<FourQuarkPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl1, 1);
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl2, 2);
 | 
			
		||||
    class Result: Serializable
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        GRID_SERIALIZABLE_CLASS_MEMBERS(Result,
 | 
			
		||||
                                        std::vector<SpinColourSpinColourMatrix>, fourquark);
 | 
			
		||||
    };
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TFourQuark(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TFourQuark(void) {};
 | 
			
		||||
    // dependencies/products
 | 
			
		||||
    virtual std::vector<std::string> getInput(void);
 | 
			
		||||
    virtual std::vector<std::string> getOutput(void);
 | 
			
		||||
    // setup
 | 
			
		||||
    virtual void tensorprod(LatticeSpinColourSpinColourMatrix &lret, LatticeSpinColourMatrix a, LatticeSpinColourMatrix b);
 | 
			
		||||
    virtual void setup(void);
 | 
			
		||||
    // execution
 | 
			
		||||
    virtual void execute(void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER_TMP(FourQuark, ARG(TFourQuark<FIMPL, FIMPL>), MNPR);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                           TFourQuark implementation                            *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
TFourQuark<FImpl1, FImpl2>::TFourQuark(const std::string name)
 | 
			
		||||
: Module<FourQuarkPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
std::vector<std::string> TFourQuark<FImpl1, FImpl2>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> input = {par().Sin, par().Sout};
 | 
			
		||||
    
 | 
			
		||||
    return input;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
std::vector<std::string> TFourQuark<FImpl1, FImpl2>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> output = {getName()};
 | 
			
		||||
    
 | 
			
		||||
    return output;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
void TFourQuark<FImpl1, FImpl2>::tensorprod(LatticeSpinColourSpinColourMatrix &lret, LatticeSpinColourMatrix a, LatticeSpinColourMatrix b)
 | 
			
		||||
{
 | 
			
		||||
#if 0
 | 
			
		||||
            parallel_for(auto site=lret.begin();site<lret.end();site++) {
 | 
			
		||||
                for (int si; si < 4; ++si){
 | 
			
		||||
                for(int sj; sj <4; ++sj){
 | 
			
		||||
                    for (int ci; ci < 3; ++ci){
 | 
			
		||||
                    for (int cj; cj < 3; ++cj){
 | 
			
		||||
                        for (int sk; sk < 4; ++sk){
 | 
			
		||||
                        for(int sl; sl <4; ++sl){
 | 
			
		||||
                            for (int ck; ck < 3; ++ck){
 | 
			
		||||
                            for (int cl; cl < 3; ++cl){
 | 
			
		||||
                        lret[site]()(si,sj)(ci,cj)(sk,sl)(ck,cl)=a[site]()(si,sj)(ci,cj)*b[site]()(sk,sl)(ck,cl);
 | 
			
		||||
                            }}
 | 
			
		||||
                        }}
 | 
			
		||||
                    }}
 | 
			
		||||
                }}
 | 
			
		||||
        }
 | 
			
		||||
#else 
 | 
			
		||||
            // FIXME ; is there a general need for this construct ? In which case we should encapsulate the
 | 
			
		||||
            //         below loops in a helper function.
 | 
			
		||||
            //LOG(Message) << "sp co mat a is - " << a << std::endl;
 | 
			
		||||
            //LOG(Message) << "sp co mat b is - " << b << std::endl;
 | 
			
		||||
            parallel_for(auto site=lret.begin();site<lret.end();site++) {
 | 
			
		||||
            vTComplex left;
 | 
			
		||||
                for(int si=0; si < Ns; ++si){
 | 
			
		||||
                for(int sj=0; sj < Ns; ++sj){
 | 
			
		||||
                    for (int ci=0; ci < Nc; ++ci){
 | 
			
		||||
                    for (int cj=0; cj < Nc; ++cj){
 | 
			
		||||
                      //LOG(Message) << "si, sj, ci, cj -  " << si << ", " << sj  << ", "<< ci  << ", "<< cj << std::endl;
 | 
			
		||||
                      left()()() = a[site]()(si,sj)(ci,cj);
 | 
			
		||||
                      //LOG(Message) << left << std::endl;
 | 
			
		||||
                      lret[site]()(si,sj)(ci,cj)=left()*b[site]();
 | 
			
		||||
                    }}
 | 
			
		||||
                }}
 | 
			
		||||
            }
 | 
			
		||||
#endif      
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
void TFourQuark<FImpl1, FImpl2>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    envCreateLat(LatticeSpinColourMatrix, getName());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl1, typename FImpl2>
 | 
			
		||||
void TFourQuark<FImpl1, FImpl2>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
/*********************************************************************************
 | 
			
		||||
 | 
			
		||||
TFourQuark : Creates the four quark vertex required for the NPR of four-quark ops
 | 
			
		||||
 | 
			
		||||
V_{Gamma_1,Gamma_2} = sum_x [ ( g5 * adj(S'(x,p2)) * g5 * G1 * S'(x,p1) )_ci,cj;si,sj x ( g5 * adj(S'(x,p2)) * g5 * G2 S'(x,p1) )_ck,cl;sk,cl ]
 | 
			
		||||
 | 
			
		||||
Create a bilinear vertex for G1 and G2  the spin and colour indices are kept free. Where there are 16 potential Gs.
 | 
			
		||||
We then find the outer product of V1 and V2, keeping the spin and colour indices uncontracted
 | 
			
		||||
Then this is summed over the lattice coordinate
 | 
			
		||||
Result is a SpinColourSpinColourMatrix - with 4 colour and 4 spin indices. 
 | 
			
		||||
We have up to 256 of these including the offdiag (G1 != G2).
 | 
			
		||||
 | 
			
		||||
        \         /
 | 
			
		||||
         \p1   p1/
 | 
			
		||||
          \     /
 | 
			
		||||
           \   /
 | 
			
		||||
         G1 * * G2
 | 
			
		||||
           /   \
 | 
			
		||||
          /     \
 | 
			
		||||
         /p2   p2\
 | 
			
		||||
        /         \
 | 
			
		||||
 | 
			
		||||
*********************************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    LOG(Message) << "Computing fourquark contractions '" << getName() << "' using"
 | 
			
		||||
                 << " momentum '" << par().Sin << "' and '" << par().Sout << "'"
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
    
 | 
			
		||||
    BinaryWriter             writer(par().output);
 | 
			
		||||
    
 | 
			
		||||
    PropagatorField1                            &Sin = *env().template getObject<PropagatorField1>(par().Sin);
 | 
			
		||||
    PropagatorField2                            &Sout = *env().template getObject<PropagatorField2>(par().Sout);
 | 
			
		||||
    std::vector<Real>                           pin  = strToVec<Real>(par().pin), pout = strToVec<Real>(par().pout);
 | 
			
		||||
    bool                                        fullbasis = par().fullbasis;
 | 
			
		||||
    Gamma                                       g5(Gamma::Algebra::Gamma5);
 | 
			
		||||
    Result                                      result;
 | 
			
		||||
    std::vector<Real>                           latt_size(pin.begin(), pin.end());
 | 
			
		||||
    LatticeComplex                              pdotxin(env().getGrid()), pdotxout(env().getGrid()), coor(env().getGrid());
 | 
			
		||||
    LatticeSpinColourMatrix                     bilinear_mu(env().getGrid()), bilinear_nu(env().getGrid());
 | 
			
		||||
    LatticeSpinColourSpinColourMatrix           lret(env().getGrid()); 
 | 
			
		||||
    Complex                         Ci(0.0,1.0);
 | 
			
		||||
 | 
			
		||||
    //Phase propagators
 | 
			
		||||
    //Sin = Grid::QCD::PropUtils::PhaseProps(Sin,pin);
 | 
			
		||||
    //Sout = Grid::QCD::PropUtils::PhaseProps(Sout,pout);
 | 
			
		||||
    
 | 
			
		||||
    //find p.x for in and out so phase can be accounted for in propagators
 | 
			
		||||
    pdotxin=zero;
 | 
			
		||||
    pdotxout=zero;
 | 
			
		||||
    for (unsigned int mu = 0; mu < 4; ++mu)
 | 
			
		||||
    {
 | 
			
		||||
        Real TwoPiL =  M_PI * 2.0/ latt_size[mu];
 | 
			
		||||
        LatticeCoordinate(coor,mu);
 | 
			
		||||
        pdotxin = pdotxin +(TwoPiL * pin[mu]) * coor;
 | 
			
		||||
        pdotxout= pdotxout +(TwoPiL * pout[mu]) * coor;
 | 
			
		||||
    }
 | 
			
		||||
    Sin = Sin*exp(-Ci*pdotxin); //phase corrections
 | 
			
		||||
    Sout = Sout*exp(-Ci*pdotxout);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //Set up Gammas 
 | 
			
		||||
    std::vector<Gamma> gammavector;
 | 
			
		||||
     for( int i=1; i<Gamma::nGamma; i+=2){
 | 
			
		||||
         Gamma::Algebra gam = i;
 | 
			
		||||
         gammavector.push_back(Gamma(gam));
 | 
			
		||||
       }
 | 
			
		||||
    
 | 
			
		||||
    lret = zero;
 | 
			
		||||
    if (fullbasis == true){ // all combinations of mu and nu
 | 
			
		||||
        result.fourquark.resize(Gamma::nGamma/2*Gamma::nGamma/2);
 | 
			
		||||
        for( int mu=0; mu<Gamma::nGamma/2; mu++){ 
 | 
			
		||||
            bilinear_mu = g5*adj(Sout)*g5*gammavector[mu]*Sin;
 | 
			
		||||
            for ( int nu=0; nu<Gamma::nGamma; nu++){
 | 
			
		||||
                LatticeSpinColourMatrix     bilinear_nu(env().getGrid());
 | 
			
		||||
                bilinear_nu = g5*adj(Sout)*g5*gammavector[nu]*Sin;
 | 
			
		||||
                LOG(Message) << "bilinear_nu for nu = " << nu << " is - " << bilinear_mu << std::endl;
 | 
			
		||||
                result.fourquark[mu*Gamma::nGamma/2 + nu] = zero;
 | 
			
		||||
                tensorprod(lret,bilinear_mu,bilinear_nu);
 | 
			
		||||
                result.fourquark[mu*Gamma::nGamma/2 + nu] = sum(lret);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        result.fourquark.resize(Gamma::nGamma/2);
 | 
			
		||||
        for ( int mu=0; mu<1; mu++){
 | 
			
		||||
        //for( int mu=0; mu<Gamma::nGamma/2; mu++ ){
 | 
			
		||||
            bilinear_mu = g5*adj(Sout)*g5*gammavector[mu]*Sin;
 | 
			
		||||
            //LOG(Message) << "bilinear_mu for mu = " << mu << " is - " << bilinear_mu << std::endl;
 | 
			
		||||
            result.fourquark[mu] = zero;
 | 
			
		||||
            tensorprod(lret,bilinear_mu,bilinear_mu); //tensor outer product
 | 
			
		||||
            result.fourquark[mu] = sum(lret);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    write(writer, "fourquark", result.fourquark);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_FourQuark_hpp_
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MNoise/FullVolumeSpinColorDiagonal.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
Author: Vera Guelpers <Vera.Guelpers@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 <Hadrons/Modules/MNoise/FullVolumeSpinColorDiagonal.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MNoise;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MNoise::TFullVolumeSpinColorDiagonal<FIMPL>;
 | 
			
		||||
template class Grid::Hadrons::MNoise::TFullVolumeSpinColorDiagonal<ZFIMPL>;
 | 
			
		||||
@@ -1,121 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MNoise/FullVolumeSpinColorDiagonal.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
Author: Vera Guelpers <Vera.Guelpers@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 Hadrons_MNoise_FullVolumeSpinColorDiagonal_hpp_
 | 
			
		||||
#define Hadrons_MNoise_FullVolumeSpinColorDiagonal_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Hadrons/DilutedNoise.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *             Generate full volume spin-color diagonal noise                *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MNoise)
 | 
			
		||||
 | 
			
		||||
class FullVolumeSpinColorDiagonalPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(FullVolumeSpinColorDiagonalPar,
 | 
			
		||||
                                    unsigned int, nsrc);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TFullVolumeSpinColorDiagonal: public Module<FullVolumeSpinColorDiagonalPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TFullVolumeSpinColorDiagonal(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TFullVolumeSpinColorDiagonal(void) {};
 | 
			
		||||
    // 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_TMP(FullVolumeSpinColorDiagonal, TFullVolumeSpinColorDiagonal<FIMPL>, MNoise);
 | 
			
		||||
MODULE_REGISTER_TMP(ZFullVolumeSpinColorDiagonal, TFullVolumeSpinColorDiagonal<ZFIMPL>, MNoise);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *              TFullVolumeSpinColorDiagonal implementation                  *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
TFullVolumeSpinColorDiagonal<FImpl>::TFullVolumeSpinColorDiagonal(const std::string name)
 | 
			
		||||
: Module<FullVolumeSpinColorDiagonalPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TFullVolumeSpinColorDiagonal<FImpl>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in;
 | 
			
		||||
    
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TFullVolumeSpinColorDiagonal<FImpl>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName()};
 | 
			
		||||
    
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TFullVolumeSpinColorDiagonal<FImpl>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    envCreateDerived(DilutedNoise<FImpl>, 
 | 
			
		||||
                     FullVolumeSpinColorDiagonalNoise<FImpl>,
 | 
			
		||||
                     getName(), 1, envGetGrid(FermionField), par().nsrc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TFullVolumeSpinColorDiagonal<FImpl>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    auto &noise = envGet(DilutedNoise<FImpl>, getName());
 | 
			
		||||
    LOG(Message) << "Generating full volume, spin-color diagonal noise" << std::endl;
 | 
			
		||||
    noise.generateNoise(rng4d());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MNoise_FullVolumeSpinColorDiagonal_hpp_
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MNoise;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MNoise::TTimeDilutedSpinColorDiagonal<FIMPL>;
 | 
			
		||||
template class Grid::Hadrons::MNoise::TTimeDilutedSpinColorDiagonal<ZFIMPL>;
 | 
			
		||||
@@ -1,114 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_MNoise_TimeDilutedSpinColorDiagonal_hpp_
 | 
			
		||||
#define Hadrons_MNoise_TimeDilutedSpinColorDiagonal_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Hadrons/DilutedNoise.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *             Generate time diluted spin-color diagonal noise                *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MNoise)
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TTimeDilutedSpinColorDiagonal: public Module<NoPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TTimeDilutedSpinColorDiagonal(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TTimeDilutedSpinColorDiagonal(void) {};
 | 
			
		||||
    // 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_TMP(TimeDilutedSpinColorDiagonal, TTimeDilutedSpinColorDiagonal<FIMPL>, MNoise);
 | 
			
		||||
MODULE_REGISTER_TMP(ZTimeDilutedSpinColorDiagonal, TTimeDilutedSpinColorDiagonal<ZFIMPL>, MNoise);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *              TTimeDilutedSpinColorDiagonal implementation                  *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
TTimeDilutedSpinColorDiagonal<FImpl>::TTimeDilutedSpinColorDiagonal(const std::string name)
 | 
			
		||||
: Module<NoPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TTimeDilutedSpinColorDiagonal<FImpl>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in;
 | 
			
		||||
    
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TTimeDilutedSpinColorDiagonal<FImpl>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName()};
 | 
			
		||||
    
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TTimeDilutedSpinColorDiagonal<FImpl>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    envCreateDerived(DilutedNoise<FImpl>, 
 | 
			
		||||
                     TimeDilutedSpinColorDiagonalNoise<FImpl>,
 | 
			
		||||
                     getName(), 1, envGetGrid(FermionField));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TTimeDilutedSpinColorDiagonal<FImpl>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    auto &noise = envGet(DilutedNoise<FImpl>, getName());
 | 
			
		||||
 | 
			
		||||
    LOG(Message) << "Generating time-diluted, spin-color diagonal noise" << std::endl;
 | 
			
		||||
    noise.generateNoise(rng4d());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MNoise_TimeDilutedSpinColorDiagonal_hpp_
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MScalarSUN/StochFreeField.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MScalarSUN/StochFreeField.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MScalarSUN;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MScalarSUN::TStochFreeField<ScalarNxNAdjImplR<2>>;
 | 
			
		||||
template class Grid::Hadrons::MScalarSUN::TStochFreeField<ScalarNxNAdjImplR<3>>;
 | 
			
		||||
template class Grid::Hadrons::MScalarSUN::TStochFreeField<ScalarNxNAdjImplR<4>>;
 | 
			
		||||
template class Grid::Hadrons::MScalarSUN::TStochFreeField<ScalarNxNAdjImplR<5>>;
 | 
			
		||||
template class Grid::Hadrons::MScalarSUN::TStochFreeField<ScalarNxNAdjImplR<6>>;
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MScalarSUN/TwoPointNPR.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MScalarSUN;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MScalarSUN::TTwoPointNPR<ScalarNxNAdjImplR<2>>;
 | 
			
		||||
template class Grid::Hadrons::MScalarSUN::TTwoPointNPR<ScalarNxNAdjImplR<3>>;
 | 
			
		||||
template class Grid::Hadrons::MScalarSUN::TTwoPointNPR<ScalarNxNAdjImplR<4>>;
 | 
			
		||||
template class Grid::Hadrons::MScalarSUN::TTwoPointNPR<ScalarNxNAdjImplR<5>>;
 | 
			
		||||
template class Grid::Hadrons::MScalarSUN::TTwoPointNPR<ScalarNxNAdjImplR<6>>;
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MSolver/A2AVectors.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
Author: fionnoh <fionnoh@gmail.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 <Hadrons/Modules/MSolver/A2AVectors.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MSolver;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MSolver::TA2AVectors<FIMPL, BaseFermionEigenPack<FIMPL>>;
 | 
			
		||||
template class Grid::Hadrons::MSolver::TA2AVectors<ZFIMPL, BaseFermionEigenPack<ZFIMPL>>;
 | 
			
		||||
@@ -1,258 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MSolver/A2AVectors.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
Author: fionnoh <fionnoh@gmail.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_MSolver_A2AVectors_hpp_
 | 
			
		||||
#define Hadrons_MSolver_A2AVectors_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Hadrons/Solver.hpp>
 | 
			
		||||
#include <Hadrons/EigenPack.hpp>
 | 
			
		||||
#include <Hadrons/A2AVectors.hpp>
 | 
			
		||||
#include <Hadrons/DilutedNoise.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                       Create all-to-all V & W vectors                      *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MSolver)
 | 
			
		||||
 | 
			
		||||
class A2AVectorsPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  GRID_SERIALIZABLE_CLASS_MEMBERS(A2AVectorsPar,
 | 
			
		||||
                                  std::string, noise,
 | 
			
		||||
                                  std::string, action,
 | 
			
		||||
                                  std::string, eigenPack,
 | 
			
		||||
                                  std::string, solver,
 | 
			
		||||
                                  std::string, output,
 | 
			
		||||
                                  bool,        multiFile);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl, typename Pack>
 | 
			
		||||
class TA2AVectors : public Module<A2AVectorsPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
    SOLVER_TYPE_ALIASES(FImpl,);
 | 
			
		||||
    typedef HADRONS_DEFAULT_SCHUR_A2A<FImpl> A2A;
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TA2AVectors(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TA2AVectors(void) {};
 | 
			
		||||
    // 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);
 | 
			
		||||
private:
 | 
			
		||||
    std::string  solverName_;
 | 
			
		||||
    unsigned int Nl_{0};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER_TMP(A2AVectors, 
 | 
			
		||||
    ARG(TA2AVectors<FIMPL, BaseFermionEigenPack<FIMPL>>), MSolver);
 | 
			
		||||
MODULE_REGISTER_TMP(ZA2AVectors, 
 | 
			
		||||
    ARG(TA2AVectors<ZFIMPL, BaseFermionEigenPack<ZFIMPL>>), MSolver);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                       TA2AVectors implementation                           *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl, typename Pack>
 | 
			
		||||
TA2AVectors<FImpl, Pack>::TA2AVectors(const std::string name)
 | 
			
		||||
: Module<A2AVectorsPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl, typename Pack>
 | 
			
		||||
std::vector<std::string> TA2AVectors<FImpl, Pack>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::string              sub_string;
 | 
			
		||||
    std::vector<std::string> in;
 | 
			
		||||
 | 
			
		||||
    if (!par().eigenPack.empty())
 | 
			
		||||
    {
 | 
			
		||||
        in.push_back(par().eigenPack);
 | 
			
		||||
        sub_string = (!par().eigenPack.empty()) ? "_subtract" : "";
 | 
			
		||||
    }
 | 
			
		||||
    in.push_back(par().solver + sub_string);
 | 
			
		||||
    in.push_back(par().noise);
 | 
			
		||||
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl, typename Pack>
 | 
			
		||||
std::vector<std::string> TA2AVectors<FImpl, Pack>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName() + "_v", getName() + "_w"};
 | 
			
		||||
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl, typename Pack>
 | 
			
		||||
void TA2AVectors<FImpl, Pack>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    bool        hasLowModes = (!par().eigenPack.empty());
 | 
			
		||||
    std::string sub_string  = (hasLowModes) ? "_subtract" : "";
 | 
			
		||||
    auto        &noise      = envGet(DilutedNoise<FImpl>, par().noise);
 | 
			
		||||
    auto        &action     = envGet(FMat, par().action);
 | 
			
		||||
    auto        &solver     = envGet(Solver, par().solver + sub_string);
 | 
			
		||||
    int         Ls          = env().getObjectLs(par().action);
 | 
			
		||||
 | 
			
		||||
    if (hasLowModes)
 | 
			
		||||
    {
 | 
			
		||||
        auto &epack = envGet(Pack, par().eigenPack);
 | 
			
		||||
        Nl_ = epack.evec.size();
 | 
			
		||||
    }
 | 
			
		||||
    envCreate(std::vector<FermionField>, getName() + "_v", 1, 
 | 
			
		||||
              Nl_ + noise.size(), envGetGrid(FermionField));
 | 
			
		||||
    envCreate(std::vector<FermionField>, getName() + "_w", 1, 
 | 
			
		||||
              Nl_ + noise.size(), envGetGrid(FermionField));
 | 
			
		||||
    if (Ls > 1)
 | 
			
		||||
    {
 | 
			
		||||
        envTmpLat(FermionField, "f5", Ls);
 | 
			
		||||
    }
 | 
			
		||||
    envTmp(A2A, "a2a", 1, action, solver);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl, typename Pack>
 | 
			
		||||
void TA2AVectors<FImpl, Pack>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    std::string sub_string = (Nl_ > 0) ? "_subtract" : "";
 | 
			
		||||
    auto        &action    = envGet(FMat, par().action);
 | 
			
		||||
    auto        &solver    = envGet(Solver, par().solver + sub_string);
 | 
			
		||||
    auto        &noise     = envGet(DilutedNoise<FImpl>, par().noise);
 | 
			
		||||
    auto        &v         = envGet(std::vector<FermionField>, getName() + "_v");
 | 
			
		||||
    auto        &w         = envGet(std::vector<FermionField>, getName() + "_w");
 | 
			
		||||
    int         Ls         = env().getObjectLs(par().action);
 | 
			
		||||
 | 
			
		||||
    envGetTmp(A2A, a2a);
 | 
			
		||||
 | 
			
		||||
    if (Nl_ > 0)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(Message) << "Computing all-to-all vectors "
 | 
			
		||||
                     << " using eigenpack '" << par().eigenPack << "' ("
 | 
			
		||||
                     << Nl_ << " low modes) and noise '"
 | 
			
		||||
                     << par().noise << "' (" << noise.size() 
 | 
			
		||||
                     << " noise vectors)" << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        LOG(Message) << "Computing all-to-all vectors "
 | 
			
		||||
                     << " using noise '" << par().noise << "' (" << noise.size() 
 | 
			
		||||
                     << " noise vectors)" << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    // Low modes
 | 
			
		||||
    for (unsigned int il = 0; il < Nl_; il++)
 | 
			
		||||
    {
 | 
			
		||||
        auto &epack  = envGet(Pack, par().eigenPack);
 | 
			
		||||
 | 
			
		||||
        startTimer("V low mode");
 | 
			
		||||
        LOG(Message) << "V vector i = " << il << " (low mode)" << std::endl;
 | 
			
		||||
        if (Ls == 1)
 | 
			
		||||
        {
 | 
			
		||||
            a2a.makeLowModeV(v[il], epack.evec[il], epack.eval[il]);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            envGetTmp(FermionField, f5);
 | 
			
		||||
            a2a.makeLowModeV5D(v[il], f5, epack.evec[il], epack.eval[il]);
 | 
			
		||||
        }
 | 
			
		||||
        stopTimer("V low mode");
 | 
			
		||||
        startTimer("W low mode");
 | 
			
		||||
        LOG(Message) << "W vector i = " << il << " (low mode)" << std::endl;
 | 
			
		||||
        if (Ls == 1)
 | 
			
		||||
        {
 | 
			
		||||
            a2a.makeLowModeW(w[il], epack.evec[il], epack.eval[il]);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            envGetTmp(FermionField, f5);
 | 
			
		||||
            a2a.makeLowModeW5D(w[il], f5, epack.evec[il], epack.eval[il]);
 | 
			
		||||
        }
 | 
			
		||||
        stopTimer("W low mode");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // High modes
 | 
			
		||||
    for (unsigned int ih = 0; ih < noise.size(); ih++)
 | 
			
		||||
    {
 | 
			
		||||
        startTimer("V high mode");
 | 
			
		||||
        LOG(Message) << "V vector i = " << Nl_ + ih
 | 
			
		||||
                     << " (" << ((Nl_ > 0) ? "high " : "") 
 | 
			
		||||
                     << "stochastic mode)" << std::endl;
 | 
			
		||||
        if (Ls == 1)
 | 
			
		||||
        {
 | 
			
		||||
            a2a.makeHighModeV(v[Nl_ + ih], noise[ih]);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            envGetTmp(FermionField, f5);
 | 
			
		||||
            a2a.makeHighModeV5D(v[Nl_ + ih], f5, noise[ih]);
 | 
			
		||||
        }
 | 
			
		||||
        stopTimer("V high mode");
 | 
			
		||||
        startTimer("W high mode");
 | 
			
		||||
        LOG(Message) << "W vector i = " << Nl_ + ih
 | 
			
		||||
                     << " (" << ((Nl_ > 0) ? "high " : "") 
 | 
			
		||||
                     << "stochastic mode)" << std::endl;
 | 
			
		||||
        if (Ls == 1)
 | 
			
		||||
        {
 | 
			
		||||
            a2a.makeHighModeW(w[Nl_ + ih], noise[ih]);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            envGetTmp(FermionField, f5);
 | 
			
		||||
            a2a.makeHighModeW5D(w[Nl_ + ih], f5, noise[ih]);
 | 
			
		||||
        }
 | 
			
		||||
        stopTimer("W high mode");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // I/O if necessary
 | 
			
		||||
    if (!par().output.empty())
 | 
			
		||||
    {
 | 
			
		||||
        startTimer("V I/O");
 | 
			
		||||
        A2AVectorsIo::write(par().output + "_v", v, par().multiFile, vm().getTrajectory());
 | 
			
		||||
        stopTimer("V I/O");
 | 
			
		||||
        startTimer("W I/O");
 | 
			
		||||
        A2AVectorsIo::write(par().output + "_w", w, par().multiFile, vm().getTrajectory());
 | 
			
		||||
        stopTimer("W I/O");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MSolver_A2AVectors_hpp_
 | 
			
		||||
@@ -1,85 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MSolver/Guesser.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_MSolver_Guesser_hpp_
 | 
			
		||||
#define Hadrons_MSolver_Guesser_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/EigenPack.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MSolver)
 | 
			
		||||
 | 
			
		||||
template <typename FImpl, int nBasis>
 | 
			
		||||
std::shared_ptr<LinearFunction<typename FImpl::FermionField>> 
 | 
			
		||||
makeGuesser(const std::string epackName)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename FImpl::FermionField                  FermionField;
 | 
			
		||||
    typedef BaseFermionEigenPack<FImpl>                   EPack;
 | 
			
		||||
    typedef CoarseFermionEigenPack<FImpl, nBasis>         CoarseEPack;
 | 
			
		||||
    typedef DeflatedGuesser<FermionField>                 FineGuesser;
 | 
			
		||||
    typedef LocalCoherenceDeflatedGuesser<
 | 
			
		||||
        FermionField, typename CoarseEPack::CoarseField>  CoarseGuesser;
 | 
			
		||||
 | 
			
		||||
    std::shared_ptr<LinearFunction<typename FImpl::FermionField>> guesserPt;
 | 
			
		||||
 | 
			
		||||
    DEFINE_ENV_LAMBDA;
 | 
			
		||||
 | 
			
		||||
    if (epackName.empty())
 | 
			
		||||
    {
 | 
			
		||||
        guesserPt.reset(new ZeroGuesser<FermionField>());
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            auto &epack = envGetDerived(EPack, CoarseEPack, epackName);
 | 
			
		||||
            
 | 
			
		||||
            LOG(Message) << "using low-mode deflation with coarse eigenpack '"
 | 
			
		||||
                         << epackName << "' (" 
 | 
			
		||||
                         << epack.evecCoarse.size() << " modes)" << std::endl;
 | 
			
		||||
            guesserPt.reset(new CoarseGuesser(epack.evec, epack.evecCoarse,
 | 
			
		||||
                                              epack.evalCoarse));
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exceptions::ObjectType &e)
 | 
			
		||||
        {
 | 
			
		||||
            auto &epack = envGet(EPack, epackName);
 | 
			
		||||
 | 
			
		||||
            LOG(Message) << "using low-mode deflation with eigenpack '"
 | 
			
		||||
                         << epackName << "' (" 
 | 
			
		||||
                         << epack.evec.size() << " modes)" << std::endl;
 | 
			
		||||
            guesserPt.reset(new FineGuesser(epack.evec, epack.eval));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return guesserPt;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MSolver/MixedPrecisionRBPrecCG.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MSolver/MixedPrecisionRBPrecCG.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MSolver;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MSolver::TMixedPrecisionRBPrecCG<FIMPLF, FIMPLD, HADRONS_DEFAULT_LANCZOS_NBASIS>;
 | 
			
		||||
template class Grid::Hadrons::MSolver::TMixedPrecisionRBPrecCG<ZFIMPLF, ZFIMPLD, HADRONS_DEFAULT_LANCZOS_NBASIS>;
 | 
			
		||||
@@ -1,197 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MSolver/MixedPrecisionRBPrecCG.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_MSolver_MixedPrecisionRBPrecCG_hpp_
 | 
			
		||||
#define Hadrons_MSolver_MixedPrecisionRBPrecCG_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Hadrons/Solver.hpp>
 | 
			
		||||
#include <Hadrons/EigenPack.hpp>
 | 
			
		||||
#include <Hadrons/Modules/MSolver/Guesser.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *              Mixed precision schur red-black preconditioned CG             *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MSolver)
 | 
			
		||||
 | 
			
		||||
class MixedPrecisionRBPrecCGPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(MixedPrecisionRBPrecCGPar,
 | 
			
		||||
                                    std::string , innerAction,
 | 
			
		||||
                                    std::string , outerAction,
 | 
			
		||||
                                    unsigned int, maxInnerIteration,
 | 
			
		||||
                                    unsigned int, maxOuterIteration,
 | 
			
		||||
                                    double      , residual,
 | 
			
		||||
                                    std::string , eigenPack);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImplInner, typename FImplOuter, int nBasis>
 | 
			
		||||
class TMixedPrecisionRBPrecCG: public Module<MixedPrecisionRBPrecCGPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImplInner, Inner);
 | 
			
		||||
    FERM_TYPE_ALIASES(FImplOuter, Outer);
 | 
			
		||||
    SOLVER_TYPE_ALIASES(FImplOuter,);
 | 
			
		||||
    typedef HADRONS_DEFAULT_SCHUR_OP<FMatInner, FermionFieldInner> SchurFMatInner;
 | 
			
		||||
    typedef HADRONS_DEFAULT_SCHUR_OP<FMatOuter, FermionFieldOuter> SchurFMatOuter;
 | 
			
		||||
private:
 | 
			
		||||
    template <typename Field>
 | 
			
		||||
    class OperatorFunctionWrapper: public OperatorFunction<Field>
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        OperatorFunctionWrapper(LinearFunction<Field> &fn): fn_(fn) {};
 | 
			
		||||
        virtual ~OperatorFunctionWrapper(void) = default;
 | 
			
		||||
        virtual void operator()(LinearOperatorBase<Field> &op, 
 | 
			
		||||
                                const Field &in, Field &out)
 | 
			
		||||
        {
 | 
			
		||||
            fn_(in, out);
 | 
			
		||||
        }
 | 
			
		||||
    private:
 | 
			
		||||
        LinearFunction<Field> &fn_;
 | 
			
		||||
    };
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TMixedPrecisionRBPrecCG(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TMixedPrecisionRBPrecCG(void) {};
 | 
			
		||||
    // dependency relation
 | 
			
		||||
    virtual std::vector<std::string> getInput(void);
 | 
			
		||||
    virtual std::vector<std::string> getReference(void);
 | 
			
		||||
    virtual std::vector<std::string> getOutput(void);
 | 
			
		||||
    // setup
 | 
			
		||||
    virtual void setup(void);
 | 
			
		||||
    // execution
 | 
			
		||||
    virtual void execute(void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER_TMP(MixedPrecisionRBPrecCG, 
 | 
			
		||||
    ARG(TMixedPrecisionRBPrecCG<FIMPLF, FIMPLD, HADRONS_DEFAULT_LANCZOS_NBASIS>), MSolver);
 | 
			
		||||
MODULE_REGISTER_TMP(ZMixedPrecisionRBPrecCG, 
 | 
			
		||||
    ARG(TMixedPrecisionRBPrecCG<ZFIMPLF, ZFIMPLD, HADRONS_DEFAULT_LANCZOS_NBASIS>), MSolver);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                 TMixedPrecisionRBPrecCG implementation                             *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImplInner, typename FImplOuter, int nBasis>
 | 
			
		||||
TMixedPrecisionRBPrecCG<FImplInner, FImplOuter, nBasis>
 | 
			
		||||
::TMixedPrecisionRBPrecCG(const std::string name)
 | 
			
		||||
: Module<MixedPrecisionRBPrecCGPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImplInner, typename FImplOuter, int nBasis>
 | 
			
		||||
std::vector<std::string> TMixedPrecisionRBPrecCG<FImplInner, FImplOuter, nBasis>
 | 
			
		||||
::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in;
 | 
			
		||||
    
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImplInner, typename FImplOuter, int nBasis>
 | 
			
		||||
std::vector<std::string> TMixedPrecisionRBPrecCG<FImplInner, FImplOuter, nBasis>
 | 
			
		||||
::getReference(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> ref = {par().innerAction, par().outerAction};
 | 
			
		||||
    
 | 
			
		||||
    if (!par().eigenPack.empty())
 | 
			
		||||
    {
 | 
			
		||||
        ref.push_back(par().eigenPack);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return ref;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImplInner, typename FImplOuter, int nBasis>
 | 
			
		||||
std::vector<std::string> TMixedPrecisionRBPrecCG<FImplInner, FImplOuter, nBasis>
 | 
			
		||||
::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName(), getName() + "_subtract"};
 | 
			
		||||
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImplInner, typename FImplOuter, int nBasis>
 | 
			
		||||
void TMixedPrecisionRBPrecCG<FImplInner, FImplOuter, nBasis>
 | 
			
		||||
::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    LOG(Message) << "Setting up Schur red-black preconditioned mixed-precision "
 | 
			
		||||
                 << "CG for inner/outer action '" << par().innerAction 
 | 
			
		||||
                 << "'/'" << par().outerAction << "', residual "
 | 
			
		||||
                 << par().residual << ", and maximum inner/outer iteration " 
 | 
			
		||||
                 << par().maxInnerIteration << "/" << par().maxOuterIteration
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
 | 
			
		||||
    auto Ls        = env().getObjectLs(par().innerAction);
 | 
			
		||||
    auto &imat     = envGet(FMatInner, par().innerAction);
 | 
			
		||||
    auto &omat     = envGet(FMatOuter, par().outerAction);
 | 
			
		||||
    auto guesserPt = makeGuesser<FImplOuter, nBasis>(par().eigenPack);
 | 
			
		||||
 | 
			
		||||
    auto makeSolver = [&imat, &omat, guesserPt, Ls, this](bool subGuess) 
 | 
			
		||||
    {
 | 
			
		||||
        return [&imat, &omat, guesserPt, subGuess, Ls, this]
 | 
			
		||||
        (FermionFieldOuter &sol, const FermionFieldOuter &source) 
 | 
			
		||||
        {
 | 
			
		||||
            typedef typename FermionFieldInner::vector_type VTypeInner;
 | 
			
		||||
 | 
			
		||||
            SchurFMatInner simat(imat);
 | 
			
		||||
            SchurFMatOuter somat(omat);
 | 
			
		||||
            MixedPrecisionConjugateGradient<FermionFieldOuter, FermionFieldInner> 
 | 
			
		||||
                mpcg(par().residual, par().maxInnerIteration, 
 | 
			
		||||
                     par().maxOuterIteration, 
 | 
			
		||||
                     env().template getRbGrid<VTypeInner>(Ls),
 | 
			
		||||
                     simat, somat);
 | 
			
		||||
            OperatorFunctionWrapper<FermionFieldOuter> wmpcg(mpcg);
 | 
			
		||||
            HADRONS_DEFAULT_SCHUR_SOLVE<FermionFieldOuter> schurSolver(wmpcg);
 | 
			
		||||
            schurSolver.subtractGuess(subGuess);
 | 
			
		||||
            schurSolver(omat, source, sol, *guesserPt);
 | 
			
		||||
        };
 | 
			
		||||
    };
 | 
			
		||||
    auto solver = makeSolver(false);
 | 
			
		||||
    envCreate(Solver, getName(), Ls, solver, omat);
 | 
			
		||||
    auto solver_subtract = makeSolver(true);
 | 
			
		||||
    envCreate(Solver, getName() + "_subtract", Ls, solver_subtract, omat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImplInner, typename FImplOuter, int nBasis>
 | 
			
		||||
void TMixedPrecisionRBPrecCG<FImplInner, FImplOuter, nBasis>
 | 
			
		||||
::execute(void)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MSolver_MixedPrecisionRBPrecCG_hpp_
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MSource/Momentum.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
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 */
 | 
			
		||||
#include <Hadrons/Modules/MSource/Momentum.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MSource;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MSource::TMomentum<FIMPL>;
 | 
			
		||||
 | 
			
		||||
@@ -1,149 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MSource/Momentum.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
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 Hadrons_Momentum_hpp_
 | 
			
		||||
#define Hadrons_Momentum_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
Plane Wave source
 | 
			
		||||
-----------------
 | 
			
		||||
src_x = e^i2pi/L * p *position
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                          Plane Wave source                                 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MSource)
 | 
			
		||||
 | 
			
		||||
class MomentumPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
//What is meant by serializable in this context
 | 
			
		||||
GRID_SERIALIZABLE_CLASS_MEMBERS(MomentumPar,
 | 
			
		||||
std::string, mom);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TMomentum: public Module<MomentumPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
public:
 | 
			
		||||
// constructor
 | 
			
		||||
TMomentum(const std::string name);
 | 
			
		||||
// destructor
 | 
			
		||||
virtual ~TMomentum(void) {};
 | 
			
		||||
// 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_TMP(Momentum, TMomentum<FIMPL>, MSource);
 | 
			
		||||
//MODULE_REGISTER_NS(Momentum, TMomentum, MSource);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
*                       TMomentum template implementation                     *
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
TMomentum<FImpl>::TMomentum(const std::string name)
 | 
			
		||||
: Module<MomentumPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TMomentum<FImpl>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in;
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TMomentum<FImpl>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName()};
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TMomentum<FImpl>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    envCreateLat(PropagatorField, getName());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//execution//////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TMomentum<FImpl>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    LOG(Message) << "Generating planewave momentum source with momentum " << par().mom << std::endl;
 | 
			
		||||
    //what does this env do?
 | 
			
		||||
    PropagatorField &src = envGet(PropagatorField, getName());
 | 
			
		||||
    Lattice<iScalar<vInteger>> t(env().getGrid());
 | 
			
		||||
    LatticeComplex             C(env().getGrid()), coor(env().getGrid());
 | 
			
		||||
    std::vector<Real>          p;
 | 
			
		||||
    std::vector<Real> latt_size(GridDefaultLatt().begin(), GridDefaultLatt().end()); 
 | 
			
		||||
    Complex                    i(0.0,1.0);
 | 
			
		||||
 | 
			
		||||
    LOG(Message) << " " << std::endl;
 | 
			
		||||
    //get the momentum from parameters
 | 
			
		||||
    p  = strToVec<Real>(par().mom);
 | 
			
		||||
    C = zero;
 | 
			
		||||
    LOG(Message) << "momentum converted from string - " << std::to_string(p[0]) <<std::to_string(p[1]) <<std::to_string(p[2]) <<   std::to_string(p[3]) << std::endl;
 | 
			
		||||
    for(int mu=0;mu<4;mu++){
 | 
			
		||||
    Real TwoPiL =  M_PI * 2.0/ latt_size[mu];
 | 
			
		||||
    LatticeCoordinate(coor,mu);
 | 
			
		||||
    C = C +(TwoPiL * p[mu]) * coor;
 | 
			
		||||
    }
 | 
			
		||||
    C = exp(C*i);
 | 
			
		||||
    LOG(Message) << "exponential of pdotx taken " << std::endl;
 | 
			
		||||
    src = src + C;
 | 
			
		||||
    LOG(Message) << "source created" << std::endl;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_Momentum_hpp_
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MUtilities/PrecisionCast.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MUtilities/PrecisionCast.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MUtilities;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MUtilities::TPrecisionCast<GIMPLD::GaugeField, GIMPLF::GaugeField>;
 | 
			
		||||
template class Grid::Hadrons::MUtilities::TPrecisionCast<FIMPLD::FermionField, FIMPLF::FermionField>;
 | 
			
		||||
@@ -1,124 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MUtilities/PrecisionCast.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_MUtilities_PrecisionCast_hpp_
 | 
			
		||||
#define Hadrons_MUtilities_PrecisionCast_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                          Precision cast module                             *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MUtilities)
 | 
			
		||||
 | 
			
		||||
class PrecisionCastPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(PrecisionCastPar,
 | 
			
		||||
                                    std::string, field);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FieldIn, typename FieldOut>
 | 
			
		||||
class TPrecisionCast: public Module<PrecisionCastPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TPrecisionCast(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TPrecisionCast(void) {};
 | 
			
		||||
    // 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_TMP(GaugeSinglePrecisionCast, 
 | 
			
		||||
                    ARG(TPrecisionCast<GIMPLD::GaugeField, GIMPLF::GaugeField>),
 | 
			
		||||
                    MUtilities);
 | 
			
		||||
MODULE_REGISTER_TMP(FermionSinglePrecisionCast, 
 | 
			
		||||
                    ARG(TPrecisionCast<FIMPLD::FermionField, FIMPLF::FermionField>),
 | 
			
		||||
                    MUtilities);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                     TPrecisionCast implementation                          *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FieldIn, typename FieldOut>
 | 
			
		||||
TPrecisionCast<FieldIn, FieldOut>::TPrecisionCast(const std::string name)
 | 
			
		||||
: Module<PrecisionCastPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FieldIn, typename FieldOut>
 | 
			
		||||
std::vector<std::string> TPrecisionCast<FieldIn, FieldOut>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in = {par().field};
 | 
			
		||||
    
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FieldIn, typename FieldOut>
 | 
			
		||||
std::vector<std::string> TPrecisionCast<FieldIn, FieldOut>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName()};
 | 
			
		||||
    
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FieldIn, typename FieldOut>
 | 
			
		||||
void TPrecisionCast<FieldIn, FieldOut>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    envCreateLat(FieldOut, getName());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FieldIn, typename FieldOut>
 | 
			
		||||
void TPrecisionCast<FieldIn, FieldOut>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    LOG(Message) << "Casting field '" << par().field << "'" << std::endl;
 | 
			
		||||
    LOG(Message) << "In  type: " << typeName<FieldIn>() << std::endl;
 | 
			
		||||
    LOG(Message) << "Out type: " << typeName<FieldOut>() << std::endl;
 | 
			
		||||
 | 
			
		||||
    auto &in  = envGet(FieldIn,  par().field);
 | 
			
		||||
    auto &out = envGet(FieldOut, getName());
 | 
			
		||||
 | 
			
		||||
    precisionChange(out, in);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MUtilities_PrecisionCast_hpp_
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MUtilities/RandomVectors.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/Modules/MUtilities/RandomVectors.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MUtilities;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MUtilities::TRandomVectors<FIMPL::FermionField>;
 | 
			
		||||
@@ -1,128 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MUtilities/RandomVectors.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_MUtilities_RandomVectors_hpp_
 | 
			
		||||
#define Hadrons_MUtilities_RandomVectors_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *           Module generating random lattices for testing purposes           *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MUtilities)
 | 
			
		||||
 | 
			
		||||
class RandomVectorsPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(RandomVectorsPar,
 | 
			
		||||
                                    unsigned int, size,
 | 
			
		||||
                                    unsigned int, Ls);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename Field>
 | 
			
		||||
class TRandomVectors: public Module<RandomVectorsPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TRandomVectors(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TRandomVectors(void) {};
 | 
			
		||||
    // 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_TMP(RandomFermions, TRandomVectors<FIMPL::FermionField>, MUtilities);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                      TRandomVectors implementation                         *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename Field>
 | 
			
		||||
TRandomVectors<Field>::TRandomVectors(const std::string name)
 | 
			
		||||
: Module<RandomVectorsPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename Field>
 | 
			
		||||
std::vector<std::string> TRandomVectors<Field>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in;
 | 
			
		||||
    
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename Field>
 | 
			
		||||
std::vector<std::string> TRandomVectors<Field>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName()};
 | 
			
		||||
    
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename Field>
 | 
			
		||||
void TRandomVectors<Field>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    if (par().Ls > 1)
 | 
			
		||||
    {
 | 
			
		||||
        envCreate(std::vector<Field>, getName(), par().Ls, par().size, 
 | 
			
		||||
                  envGetGrid(Field, par().Ls));
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        envCreate(std::vector<Field>, getName(), 1, par().size, envGetGrid(Field));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename Field>
 | 
			
		||||
void TRandomVectors<Field>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    LOG(Message) << "Generating " << par().size << " random vectors" << std::endl;
 | 
			
		||||
 | 
			
		||||
    auto &vec = envGet(std::vector<Field>, getName());
 | 
			
		||||
    
 | 
			
		||||
    for (unsigned int i = 0; i < vec.size(); ++i)
 | 
			
		||||
    {
 | 
			
		||||
        random(rng4d(), vec[i]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MUtilities_RandomVectors_hpp_
 | 
			
		||||
@@ -1,126 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/TimerArray.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/TimerArray.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace QCD;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
 | 
			
		||||
void TimerArray::startTimer(const std::string &name)
 | 
			
		||||
{
 | 
			
		||||
    if (!name.empty())
 | 
			
		||||
    {
 | 
			
		||||
        timer_[name].Start();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GridTime TimerArray::getTimer(const std::string &name)
 | 
			
		||||
{
 | 
			
		||||
    GridTime t;
 | 
			
		||||
    
 | 
			
		||||
    if (!name.empty())
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            bool running = timer_.at(name).isRunning();
 | 
			
		||||
 | 
			
		||||
            if (running) stopTimer(name);
 | 
			
		||||
            t = timer_.at(name).Elapsed();
 | 
			
		||||
            if (running) startTimer(name);
 | 
			
		||||
        }
 | 
			
		||||
        catch (std::out_of_range &)
 | 
			
		||||
        {
 | 
			
		||||
            t = GridTime::zero();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        t = GridTime::zero();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
double TimerArray::getDTimer(const std::string &name)
 | 
			
		||||
{
 | 
			
		||||
    return static_cast<double>(getTimer(name).count());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TimerArray::startCurrentTimer(const std::string &name)
 | 
			
		||||
{
 | 
			
		||||
    if (!name.empty())
 | 
			
		||||
    {
 | 
			
		||||
        stopCurrentTimer();
 | 
			
		||||
        startTimer(name);
 | 
			
		||||
        currentTimer_ = name;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TimerArray::stopTimer(const std::string &name)
 | 
			
		||||
{
 | 
			
		||||
    if (timer_.at(name).isRunning())
 | 
			
		||||
    {
 | 
			
		||||
        timer_.at(name).Stop();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TimerArray::stopCurrentTimer(void)
 | 
			
		||||
{
 | 
			
		||||
    if (!currentTimer_.empty())
 | 
			
		||||
    {
 | 
			
		||||
        stopTimer(currentTimer_);
 | 
			
		||||
        currentTimer_ = "";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TimerArray::stopAllTimers(void)
 | 
			
		||||
{
 | 
			
		||||
    for (auto &t: timer_)
 | 
			
		||||
    {
 | 
			
		||||
        stopTimer(t.first);
 | 
			
		||||
    }
 | 
			
		||||
    currentTimer_ = "";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TimerArray::resetTimers(void)
 | 
			
		||||
{
 | 
			
		||||
    timer_.clear();
 | 
			
		||||
    currentTimer_ = "";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::map<std::string, GridTime> TimerArray::getTimings(void)
 | 
			
		||||
{
 | 
			
		||||
    std::map<std::string, GridTime> timing;
 | 
			
		||||
 | 
			
		||||
    for (auto &t: timer_)
 | 
			
		||||
    {
 | 
			
		||||
        timing[t.first] = t.second.Elapsed();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return timing;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,217 +0,0 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Utilities/EigenPackCast.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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 <Hadrons/EigenPack.hpp>
 | 
			
		||||
#include <Hadrons/Environment.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace QCD;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
 | 
			
		||||
template <typename FOut, typename FIn>
 | 
			
		||||
void convert(const std::string outFilename, const std::string inFilename, 
 | 
			
		||||
             const unsigned int Ls, const bool rb, const unsigned int size, 
 | 
			
		||||
             const bool multiFile, const bool testRead)
 | 
			
		||||
{
 | 
			
		||||
    assert(outFilename != inFilename);
 | 
			
		||||
    
 | 
			
		||||
    typedef EigenPack<FOut>            EPOut;
 | 
			
		||||
    typedef EigenPack<FIn>             EPIn;
 | 
			
		||||
    typedef typename FOut::vector_type VTypeOut;
 | 
			
		||||
    typedef typename FIn::vector_type  VTypeIn;
 | 
			
		||||
 | 
			
		||||
    std::shared_ptr<GridCartesian>         gInBase, gOutBase, gIn5, gOut5;
 | 
			
		||||
    std::shared_ptr<GridRedBlackCartesian> rbgIn, rbgOut;
 | 
			
		||||
    GridBase                               *gIn, *gOut;
 | 
			
		||||
 | 
			
		||||
    auto         dim     = GridDefaultLatt();
 | 
			
		||||
    unsigned int nd      = dim.size();
 | 
			
		||||
    auto         simdOut = GridDefaultSimd(nd, VTypeOut::Nsimd());
 | 
			
		||||
    auto         simdIn  = GridDefaultSimd(nd, VTypeIn::Nsimd());
 | 
			
		||||
 | 
			
		||||
    gOutBase.reset(SpaceTimeGrid::makeFourDimGrid(dim, simdOut, GridDefaultMpi()));
 | 
			
		||||
    gInBase.reset(SpaceTimeGrid::makeFourDimGrid(dim, simdIn, GridDefaultMpi()));
 | 
			
		||||
    if (rb)
 | 
			
		||||
    {
 | 
			
		||||
        if (Ls > 1)
 | 
			
		||||
        {
 | 
			
		||||
            rbgOut.reset(SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls, gOutBase.get()));
 | 
			
		||||
            rbgIn.reset(SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls, gInBase.get()));
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            rbgOut.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(gOutBase.get()));
 | 
			
		||||
            rbgIn.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(gInBase.get()));
 | 
			
		||||
        }
 | 
			
		||||
        gOut = rbgOut.get();
 | 
			
		||||
        gIn  = rbgIn.get();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        if (Ls > 1)
 | 
			
		||||
        {
 | 
			
		||||
            gOut5.reset(SpaceTimeGrid::makeFiveDimGrid(Ls, gOutBase.get()));
 | 
			
		||||
            gIn5.reset(SpaceTimeGrid::makeFiveDimGrid(Ls, gInBase.get()));
 | 
			
		||||
            gOut = gOut5.get();
 | 
			
		||||
            gIn  = gIn5.get();
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            gOut = gOutBase.get();
 | 
			
		||||
            gIn  = gInBase.get();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    FOut         bufOut(gOut);
 | 
			
		||||
    FIn          bufIn(gIn), testIn(gIn);
 | 
			
		||||
    ScidacWriter binWriter(gOut->IsBoss());
 | 
			
		||||
    ScidacReader binReader;
 | 
			
		||||
    PackRecord   record;
 | 
			
		||||
    RealD        eval;
 | 
			
		||||
 | 
			
		||||
    LOG(Message) << "==== EIGENPACK CONVERSION" << std::endl;
 | 
			
		||||
    LOG(Message) << "Lattice       : " << gIn->GlobalDimensions() << std::endl;
 | 
			
		||||
    LOG(Message) << "Checkerboarded: " << (rb ? "yes" : "no") << std::endl;
 | 
			
		||||
    LOG(Message) << "In path       : " << inFilename  << std::endl;
 | 
			
		||||
    LOG(Message) << "In type       : " << typeName<FIn>() << std::endl;
 | 
			
		||||
    LOG(Message) << "Out path      : " << outFilename << std::endl;
 | 
			
		||||
    LOG(Message) << "Out type      : " << typeName<FOut>() << std::endl;
 | 
			
		||||
    LOG(Message) << "#vectors      : " << size << std::endl;
 | 
			
		||||
    LOG(Message) << "Multifile     : " << (multiFile ? "yes" : "no") << std::endl;
 | 
			
		||||
    LOG(Message) << "Test read     : " << (testRead ? "yes" : "no") << std::endl;
 | 
			
		||||
    if (multiFile)
 | 
			
		||||
    {
 | 
			
		||||
        for(unsigned int k = 0; k < size; ++k)
 | 
			
		||||
        {
 | 
			
		||||
            std::string  outV = outFilename + "/v" + std::to_string(k) + ".bin";
 | 
			
		||||
            std::string  inV  = inFilename + "/v" + std::to_string(k) + ".bin";
 | 
			
		||||
 | 
			
		||||
            LOG(Message) << "==== Converting vector " << k << std::endl;
 | 
			
		||||
            LOG(Message) << "In : " << inV  << std::endl;
 | 
			
		||||
            LOG(Message) << "Out: " << outV << std::endl;
 | 
			
		||||
            // conversion
 | 
			
		||||
            LOG(Message) << "-- Doing conversion" << std::endl;
 | 
			
		||||
            makeFileDir(outV, gOut);
 | 
			
		||||
            binWriter.open(outV);
 | 
			
		||||
            binReader.open(inV);
 | 
			
		||||
            EigenPackIo::readHeader(record, binReader);
 | 
			
		||||
            EigenPackIo::writeHeader(binWriter, record);
 | 
			
		||||
            EigenPackIo::readElement<FIn>(bufIn, eval, k, binReader);
 | 
			
		||||
            EigenPackIo::writeElement<FIn, FOut>(binWriter, bufIn, eval, k, &bufOut, &testIn);
 | 
			
		||||
            binWriter.close();
 | 
			
		||||
            binReader.close();
 | 
			
		||||
            // read test
 | 
			
		||||
            if (testRead)
 | 
			
		||||
            {
 | 
			
		||||
                LOG(Message) << "-- Test read" << std::endl;
 | 
			
		||||
                binReader.open(outV);
 | 
			
		||||
                EigenPackIo::readElement<FOut>(bufOut, eval, k, binReader);
 | 
			
		||||
                binReader.close();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        // conversion
 | 
			
		||||
        LOG(Message) << "-- Doing conversion" << std::endl;
 | 
			
		||||
        makeFileDir(outFilename, gOut);
 | 
			
		||||
        binWriter.open(outFilename);
 | 
			
		||||
        binReader.open(inFilename);
 | 
			
		||||
        EigenPackIo::readHeader(record, binReader);
 | 
			
		||||
        EigenPackIo::writeHeader(binWriter, record);
 | 
			
		||||
        for(unsigned int k = 0; k < size; ++k)
 | 
			
		||||
        {
 | 
			
		||||
            EigenPackIo::readElement<FIn>(bufIn, eval, k, binReader);
 | 
			
		||||
            EigenPackIo::writeElement<FIn, FOut>(binWriter, bufIn, eval, k, &bufOut, &testIn);
 | 
			
		||||
        }
 | 
			
		||||
        binWriter.close();
 | 
			
		||||
        binReader.close();
 | 
			
		||||
        // read test
 | 
			
		||||
        if (testRead)
 | 
			
		||||
        {
 | 
			
		||||
            LOG(Message) << "-- Test read" << std::endl;
 | 
			
		||||
            binReader.open(outFilename);
 | 
			
		||||
            EigenPackIo::readHeader(record, binReader);
 | 
			
		||||
            for(unsigned int k = 0; k < size; ++k)
 | 
			
		||||
            {
 | 
			
		||||
                EigenPackIo::readElement<FOut>(bufOut, eval, k, binReader);
 | 
			
		||||
            }
 | 
			
		||||
            binReader.close();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifndef FOUT
 | 
			
		||||
#warning "FOUT undefined (set to WilsonImplF::FermionField by default)"
 | 
			
		||||
#define FOUT WilsonImplF::FermionField
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef FIN
 | 
			
		||||
#warning "FIN undefined (set to WilsonImplD::FermionField by default)"
 | 
			
		||||
#define FIN WilsonImplD::FermionField
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
    // parse command line
 | 
			
		||||
    std::string  outFilename, inFilename;
 | 
			
		||||
    unsigned int size, Ls;
 | 
			
		||||
    bool         rb, multiFile, testRead;
 | 
			
		||||
    
 | 
			
		||||
    if (argc < 8)
 | 
			
		||||
    {
 | 
			
		||||
        std::cerr << "usage: " << argv[0] << " <out eigenpack> <in eigenpack> <Ls> <red-black {0|1}> <#vector> <multifile {0|1}> <test read {0|1}> [Grid options]";
 | 
			
		||||
        std::cerr << std::endl;
 | 
			
		||||
        std::exit(EXIT_FAILURE);
 | 
			
		||||
    }
 | 
			
		||||
    outFilename = argv[1];
 | 
			
		||||
    inFilename  = argv[2];
 | 
			
		||||
    Ls          = std::stoi(std::string(argv[3]));
 | 
			
		||||
    rb          = (std::string(argv[4]) != "0");
 | 
			
		||||
    size        = std::stoi(std::string(argv[5]));
 | 
			
		||||
    multiFile   = (std::string(argv[6]) != "0");
 | 
			
		||||
    testRead    = (std::string(argv[7]) != "0");
 | 
			
		||||
    
 | 
			
		||||
    // initialization
 | 
			
		||||
    Grid_init(&argc, &argv);
 | 
			
		||||
    initLogger();
 | 
			
		||||
 | 
			
		||||
    // execution
 | 
			
		||||
    try
 | 
			
		||||
    {
 | 
			
		||||
        convert<FOUT, FIN>(outFilename, inFilename, Ls, rb, size, multiFile, testRead);
 | 
			
		||||
    }
 | 
			
		||||
    catch (const std::exception& e)
 | 
			
		||||
    {
 | 
			
		||||
        Exceptions::abort(e);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // epilogue
 | 
			
		||||
    LOG(Message) << "Grid is finalizing now" << std::endl;
 | 
			
		||||
    Grid_finalize();
 | 
			
		||||
    
 | 
			
		||||
    return EXIT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,8 +0,0 @@
 | 
			
		||||
bin_PROGRAMS = HadronsXmlRun HadronsFermionEP64To32
 | 
			
		||||
 | 
			
		||||
HadronsXmlRun_SOURCES = HadronsXmlRun.cc
 | 
			
		||||
HadronsXmlRun_LDADD   = ../libHadrons.a ../../Grid/libGrid.a
 | 
			
		||||
 | 
			
		||||
HadronsFermionEP64To32_SOURCES  = EigenPackCast.cc
 | 
			
		||||
HadronsFermionEP64To32_CXXFLAGS = $(AM_CXXFLAGS) -DFIN=WilsonImplD::FermionField -DFOUT=WilsonImplF::FermionField
 | 
			
		||||
HadronsFermionEP64To32_LDADD    = ../libHadrons.a ../../Grid/libGrid.a
 | 
			
		||||
@@ -1,10 +1,15 @@
 | 
			
		||||
# additional include paths necessary to compile the C++ library
 | 
			
		||||
SUBDIRS = Grid Hadrons benchmarks tests
 | 
			
		||||
SUBDIRS = lib benchmarks tests extras
 | 
			
		||||
 | 
			
		||||
include $(top_srcdir)/doxygen.inc
 | 
			
		||||
 | 
			
		||||
bin_SCRIPTS=grid-config
 | 
			
		||||
 | 
			
		||||
BUILT_SOURCES = version.h
 | 
			
		||||
 | 
			
		||||
version.h:
 | 
			
		||||
	echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d\\"%n" HEAD`" > $(srcdir)/lib/version.h
 | 
			
		||||
 | 
			
		||||
.PHONY: bench check tests doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL)
 | 
			
		||||
 | 
			
		||||
tests-local: all
 | 
			
		||||
 
 | 
			
		||||
@@ -1,48 +1,108 @@
 | 
			
		||||
#include <Grid/Grid.h>
 | 
			
		||||
#ifdef HAVE_LIME
 | 
			
		||||
 | 
			
		||||
#include "Benchmark_IO.hpp"
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Grid::QCD;
 | 
			
		||||
 | 
			
		||||
#define MSG cout << GridLogMessage
 | 
			
		||||
#define SEP \
 | 
			
		||||
"============================================================================="
 | 
			
		||||
#ifndef BENCH_IO_LMAX
 | 
			
		||||
#define BENCH_IO_LMAX 40
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace QCD;
 | 
			
		||||
typedef function<void(const string, LatticeFermion &)> WriterFn;
 | 
			
		||||
typedef function<void(LatticeFermion &, const string)> ReaderFn;
 | 
			
		||||
 | 
			
		||||
std::string filestem(const int l)
 | 
			
		||||
string filestem(const int l)
 | 
			
		||||
{
 | 
			
		||||
  return "iobench_l" + std::to_string(l);
 | 
			
		||||
  return "iobench_l" + to_string(l);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void limeWrite(const string filestem, LatticeFermion &vec)
 | 
			
		||||
{
 | 
			
		||||
  emptyUserRecord record;
 | 
			
		||||
  ScidacWriter    binWriter(vec._grid->IsBoss());
 | 
			
		||||
 | 
			
		||||
  binWriter.open(filestem + ".bin");
 | 
			
		||||
  binWriter.writeScidacFieldRecord(vec, record);
 | 
			
		||||
  binWriter.close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void limeRead(LatticeFermion &vec, const string filestem)
 | 
			
		||||
{
 | 
			
		||||
  emptyUserRecord record;
 | 
			
		||||
  ScidacReader    binReader;
 | 
			
		||||
 | 
			
		||||
  binReader.open(filestem + ".bin");
 | 
			
		||||
  binReader.readScidacFieldRecord(vec, record);
 | 
			
		||||
  binReader.close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void writeBenchmark(const int l, const WriterFn &write)
 | 
			
		||||
{
 | 
			
		||||
  auto                      mpi  = GridDefaultMpi();
 | 
			
		||||
  auto                      simd = GridDefaultSimd(Nd, vComplex::Nsimd());
 | 
			
		||||
  vector<int>               latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
 | 
			
		||||
  unique_ptr<GridCartesian> gPt(SpaceTimeGrid::makeFourDimGrid(latt, simd, mpi));
 | 
			
		||||
  GridCartesian             *g = gPt.get();
 | 
			
		||||
  GridParallelRNG           rng(g);
 | 
			
		||||
  LatticeFermion            vec(g);
 | 
			
		||||
  emptyUserRecord           record;
 | 
			
		||||
  ScidacWriter              binWriter(g->IsBoss());
 | 
			
		||||
 | 
			
		||||
  cout << "-- Local volume " << l << "^4" << endl;
 | 
			
		||||
  random(rng, vec);
 | 
			
		||||
  write(filestem(l), vec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void readBenchmark(const int l, const ReaderFn &read)
 | 
			
		||||
{
 | 
			
		||||
  auto                      mpi  = GridDefaultMpi();
 | 
			
		||||
  auto                      simd = GridDefaultSimd(Nd, vComplex::Nsimd());
 | 
			
		||||
  vector<int>               latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
 | 
			
		||||
  unique_ptr<GridCartesian> gPt(SpaceTimeGrid::makeFourDimGrid(latt, simd, mpi));
 | 
			
		||||
  GridCartesian             *g = gPt.get();
 | 
			
		||||
  LatticeFermion            vec(g);
 | 
			
		||||
  emptyUserRecord           record;
 | 
			
		||||
  ScidacReader              binReader;
 | 
			
		||||
 | 
			
		||||
  cout << "-- Local volume " << l << "^4" << endl;
 | 
			
		||||
  read(vec, filestem(l));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
 | 
			
		||||
  auto simd = GridDefaultSimd(Nd,vComplex::Nsimd());
 | 
			
		||||
  auto mpi  = GridDefaultMpi();
 | 
			
		||||
 | 
			
		||||
  int64_t threads = GridThread::GetThreads();
 | 
			
		||||
  MSG << "Grid is setup to use " << threads << " threads" << std::endl;
 | 
			
		||||
  MSG << SEP << std::endl;
 | 
			
		||||
  MSG << "Benchmark Lime write" << std::endl;
 | 
			
		||||
  MSG << SEP << std::endl;
 | 
			
		||||
  MSG << "Grid is setup to use " << threads << " threads" << endl;
 | 
			
		||||
  MSG << SEP << endl;
 | 
			
		||||
  MSG << "Benchmark Lime write" << endl;
 | 
			
		||||
  MSG << SEP << endl;
 | 
			
		||||
  for (int l = 4; l <= BENCH_IO_LMAX; l += 2)
 | 
			
		||||
  {
 | 
			
		||||
    auto             mpi  = GridDefaultMpi();
 | 
			
		||||
    std::vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
 | 
			
		||||
 | 
			
		||||
    std::cout << "-- Local volume " << l << "^4" << std::endl;
 | 
			
		||||
    writeBenchmark<LatticeFermion>(latt, filestem(l), limeWrite<LatticeFermion>);
 | 
			
		||||
    writeBenchmark(l, limeWrite);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  MSG << "Benchmark Lime read" << std::endl;
 | 
			
		||||
  MSG << SEP << std::endl;
 | 
			
		||||
  MSG << "Benchmark Lime read" << endl;
 | 
			
		||||
  MSG << SEP << endl;
 | 
			
		||||
  for (int l = 4; l <= BENCH_IO_LMAX; l += 2)
 | 
			
		||||
  {
 | 
			
		||||
    auto             mpi  = GridDefaultMpi();
 | 
			
		||||
    std::vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
 | 
			
		||||
 | 
			
		||||
    std::cout << "-- Local volume " << l << "^4" << std::endl;
 | 
			
		||||
    readBenchmark<LatticeFermion>(latt, filestem(l), limeRead<LatticeFermion>);
 | 
			
		||||
    readBenchmark(l, limeRead);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
 | 
			
		||||
  return EXIT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  return EXIT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,107 +0,0 @@
 | 
			
		||||
#ifndef Benchmark_IO_hpp_
 | 
			
		||||
#define Benchmark_IO_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Grid/Grid.h>
 | 
			
		||||
 | 
			
		||||
#define MSG std::cout << GridLogMessage
 | 
			
		||||
#define SEP \
 | 
			
		||||
"============================================================================="
 | 
			
		||||
 | 
			
		||||
namespace Grid {
 | 
			
		||||
 | 
			
		||||
template <typename Field>
 | 
			
		||||
using WriterFn = std::function<void(const std::string, Field &)> ;
 | 
			
		||||
template <typename Field>
 | 
			
		||||
using ReaderFn = std::function<void(Field &, const std::string)>;
 | 
			
		||||
 | 
			
		||||
template <typename Field>
 | 
			
		||||
void limeWrite(const std::string filestem, Field &vec)
 | 
			
		||||
{
 | 
			
		||||
  emptyUserRecord   record;
 | 
			
		||||
  QCD::ScidacWriter binWriter(vec._grid->IsBoss());
 | 
			
		||||
 | 
			
		||||
  binWriter.open(filestem + ".bin");
 | 
			
		||||
  binWriter.writeScidacFieldRecord(vec, record);
 | 
			
		||||
  binWriter.close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename Field>
 | 
			
		||||
void limeRead(Field &vec, const std::string filestem)
 | 
			
		||||
{
 | 
			
		||||
  emptyUserRecord   record;
 | 
			
		||||
  QCD::ScidacReader binReader;
 | 
			
		||||
 | 
			
		||||
  binReader.open(filestem + ".bin");
 | 
			
		||||
  binReader.readScidacFieldRecord(vec, record);
 | 
			
		||||
  binReader.close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void makeGrid(std::shared_ptr<GridBase> &gPt, 
 | 
			
		||||
                     const std::shared_ptr<GridCartesian> &gBasePt,
 | 
			
		||||
                     const unsigned int Ls = 1, const bool rb = false)
 | 
			
		||||
{
 | 
			
		||||
  if (rb)
 | 
			
		||||
  {
 | 
			
		||||
    if (Ls > 1)
 | 
			
		||||
    {
 | 
			
		||||
      gPt.reset(QCD::SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls, gBasePt.get()));
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      gPt.reset(QCD::SpaceTimeGrid::makeFourDimRedBlackGrid(gBasePt.get()));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    if (Ls > 1)
 | 
			
		||||
    {
 | 
			
		||||
        gPt.reset(QCD::SpaceTimeGrid::makeFiveDimGrid(Ls, gBasePt.get()));
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        gPt = gBasePt;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename Field>
 | 
			
		||||
void writeBenchmark(const std::vector<int> &latt, const std::string filename,
 | 
			
		||||
                    const WriterFn<Field> &write, 
 | 
			
		||||
                    const unsigned int Ls = 1, const bool rb = false)
 | 
			
		||||
{
 | 
			
		||||
  auto                           mpi  = GridDefaultMpi();
 | 
			
		||||
  auto                           simd = GridDefaultSimd(latt.size(), Field::vector_type::Nsimd());
 | 
			
		||||
  std::shared_ptr<GridCartesian> gBasePt(QCD::SpaceTimeGrid::makeFourDimGrid(latt, simd, mpi));
 | 
			
		||||
  std::shared_ptr<GridBase>      gPt;
 | 
			
		||||
 | 
			
		||||
  makeGrid(gPt, gBasePt, Ls, rb);
 | 
			
		||||
 | 
			
		||||
  GridBase                       *g = gPt.get();
 | 
			
		||||
  GridParallelRNG                rng(g);
 | 
			
		||||
  Field                          vec(g);
 | 
			
		||||
 | 
			
		||||
  random(rng, vec);
 | 
			
		||||
  write(filename, vec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename Field>
 | 
			
		||||
void readBenchmark(const std::vector<int> &latt, const std::string filename,
 | 
			
		||||
                   const ReaderFn<Field> &read, 
 | 
			
		||||
                   const unsigned int Ls = 1, const bool rb = false)
 | 
			
		||||
{
 | 
			
		||||
  auto                           mpi  = GridDefaultMpi();
 | 
			
		||||
  auto                           simd = GridDefaultSimd(latt.size(), Field::vector_type::Nsimd());
 | 
			
		||||
  std::shared_ptr<GridCartesian> gBasePt(QCD::SpaceTimeGrid::makeFourDimGrid(latt, simd, mpi));
 | 
			
		||||
  std::shared_ptr<GridBase>      gPt;
 | 
			
		||||
 | 
			
		||||
  makeGrid(gPt, gBasePt, Ls, rb);
 | 
			
		||||
 | 
			
		||||
  GridBase                       *g = gPt.get();
 | 
			
		||||
  Field                          vec(g);
 | 
			
		||||
 | 
			
		||||
  read(vec, filename);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // Benchmark_IO_hpp_
 | 
			
		||||
@@ -1,79 +0,0 @@
 | 
			
		||||
#include "Benchmark_IO.hpp"
 | 
			
		||||
 | 
			
		||||
#define MSG std::cout << GridLogMessage
 | 
			
		||||
#define SEP \
 | 
			
		||||
"============================================================================="
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace QCD;
 | 
			
		||||
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  std::vector<std::string> dir;
 | 
			
		||||
  unsigned int             Ls;
 | 
			
		||||
  bool                     rb;
 | 
			
		||||
  if (argc < 4)
 | 
			
		||||
  {
 | 
			
		||||
    std::cerr << "usage: " << argv[0] << " <Ls> <RB {0|1}> <dir1> [<dir2> ... <dirn>] [Grid options]";
 | 
			
		||||
    std::cerr << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  Ls = std::stoi(argv[1]);
 | 
			
		||||
  rb = (std::string(argv[2]) == "1");
 | 
			
		||||
  for (unsigned int i = 3; i < argc; ++i)
 | 
			
		||||
  {
 | 
			
		||||
    std::string a = argv[i];
 | 
			
		||||
 | 
			
		||||
    if (a[0] != '-')
 | 
			
		||||
    {
 | 
			
		||||
      dir.push_back(std::string(argv[i]));
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  int64_t threads = GridThread::GetThreads();
 | 
			
		||||
  MSG << "Grid is setup to use " << threads << " threads" << std::endl;
 | 
			
		||||
  MSG << SEP << std::endl;
 | 
			
		||||
  MSG << "Benchmark double precision Lime write" << std::endl;
 | 
			
		||||
  MSG << SEP << std::endl;
 | 
			
		||||
  for (auto &d: dir)
 | 
			
		||||
  {
 | 
			
		||||
    MSG << "-- Directory " << d << std::endl;
 | 
			
		||||
    writeBenchmark<LatticeFermion>(GridDefaultLatt(), d + "/ioBench", limeWrite<LatticeFermion>, Ls, rb);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  MSG << SEP << std::endl;
 | 
			
		||||
  MSG << "Benchmark double precision Lime read" << std::endl;
 | 
			
		||||
  MSG << SEP << std::endl;
 | 
			
		||||
  for (auto &d: dir)
 | 
			
		||||
  {
 | 
			
		||||
    MSG << "-- Directory " << d << std::endl;
 | 
			
		||||
    readBenchmark<LatticeFermion>(GridDefaultLatt(), d + "/ioBench", limeRead<LatticeFermion>, Ls, rb);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  MSG << SEP << std::endl;
 | 
			
		||||
  MSG << "Benchmark single precision Lime write" << std::endl;
 | 
			
		||||
  MSG << SEP << std::endl;
 | 
			
		||||
  for (auto &d: dir)
 | 
			
		||||
  {
 | 
			
		||||
    MSG << "-- Directory " << d << std::endl;
 | 
			
		||||
    writeBenchmark<LatticeFermionF>(GridDefaultLatt(), d + "/ioBench", limeWrite<LatticeFermionF>, Ls, rb);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  MSG << SEP << std::endl;
 | 
			
		||||
  MSG << "Benchmark single precision Lime read" << std::endl;
 | 
			
		||||
  MSG << SEP << std::endl;
 | 
			
		||||
  for (auto &d: dir)
 | 
			
		||||
  {
 | 
			
		||||
    MSG << "-- Directory " << d << std::endl;
 | 
			
		||||
    readBenchmark<LatticeFermionF>(GridDefaultLatt(), d + "/ioBench", limeRead<LatticeFermionF>, Ls, rb);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
 | 
			
		||||
  return EXIT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
@@ -76,9 +76,9 @@ int main (int argc, char ** argv)
 | 
			
		||||
  std::vector<int> seeds5({5,6,7,8});
 | 
			
		||||
  
 | 
			
		||||
  std::cout << GridLogMessage << "Initialising 4d RNG" << std::endl;
 | 
			
		||||
  GridParallelRNG          RNG4(UGrid);  RNG4.SeedUniqueString(std::string("The 4D RNG"));
 | 
			
		||||
  GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4);
 | 
			
		||||
  std::cout << GridLogMessage << "Initialising 5d RNG" << std::endl;
 | 
			
		||||
  GridParallelRNG          RNG5(FGrid);  RNG5.SeedUniqueString(std::string("The 5D RNG"));
 | 
			
		||||
  GridParallelRNG          RNG5(FGrid);  RNG5.SeedFixedIntegers(seeds5);
 | 
			
		||||
  std::cout << GridLogMessage << "Initialised RNGs" << std::endl;
 | 
			
		||||
 | 
			
		||||
  LatticeFermion src   (FGrid); random(RNG5,src);
 | 
			
		||||
 
 | 
			
		||||
@@ -3,12 +3,7 @@
 | 
			
		||||
EIGEN_URL='http://bitbucket.org/eigen/eigen/get/3.3.5.tar.bz2'
 | 
			
		||||
 | 
			
		||||
echo "-- deploying Eigen source..."
 | 
			
		||||
ARC=`basename ${EIGEN_URL}`
 | 
			
		||||
wget ${EIGEN_URL} --no-check-certificate && ./scripts/update_eigen.sh ${ARC} && rm ${ARC}
 | 
			
		||||
# patch for non-portable includes in Eigen 3.3.5
 | 
			
		||||
# apparently already fixed in Eigen HEAD so it should not be 
 | 
			
		||||
# a problem in the future (A.P.)
 | 
			
		||||
patch Grid/Eigen/unsupported/CXX11/Tensor scripts/eigen-3.3.5.Tensor.patch
 | 
			
		||||
wget ${EIGEN_URL} --no-check-certificate && ./scripts/update_eigen.sh `basename ${EIGEN_URL}` && rm `basename ${EIGEN_URL}`
 | 
			
		||||
 | 
			
		||||
echo '-- generating Make.inc files...'
 | 
			
		||||
./scripts/filelist
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								configure.ac
									
									
									
									
									
								
							@@ -6,8 +6,8 @@ AC_CANONICAL_TARGET
 | 
			
		||||
AM_INIT_AUTOMAKE([subdir-objects 1.13])
 | 
			
		||||
AM_EXTRA_RECURSIVE_TARGETS([tests bench])
 | 
			
		||||
AC_CONFIG_MACRO_DIR([m4])
 | 
			
		||||
AC_CONFIG_SRCDIR([Grid/Grid.h])
 | 
			
		||||
AC_CONFIG_HEADERS([Grid/Config.h],[sed -i 's|PACKAGE_|GRID_|' Grid/Config.h])
 | 
			
		||||
AC_CONFIG_SRCDIR([lib/Grid.h])
 | 
			
		||||
AC_CONFIG_HEADERS([lib/Config.h],[sed -i 's|PACKAGE_|GRID_|' lib/Config.h])
 | 
			
		||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 | 
			
		||||
 | 
			
		||||
################ Get git info
 | 
			
		||||
@@ -41,7 +41,7 @@ AC_TYPE_UINT64_T
 | 
			
		||||
############### OpenMP
 | 
			
		||||
AC_OPENMP
 | 
			
		||||
ac_openmp=no
 | 
			
		||||
if test "${ac_cv_prog_cxx_openmp}X" != "noX"; then
 | 
			
		||||
if test "${OPENMP_CXXFLAGS}X" != "X"; then
 | 
			
		||||
  ac_openmp=yes
 | 
			
		||||
  AM_CXXFLAGS="$OPENMP_CXXFLAGS $AM_CXXFLAGS"
 | 
			
		||||
  AM_LDFLAGS="$OPENMP_CXXFLAGS $AM_LDFLAGS"
 | 
			
		||||
@@ -88,13 +88,6 @@ AC_ARG_WITH([lime],
 | 
			
		||||
            [AM_CXXFLAGS="-I$with_lime/include $AM_CXXFLAGS"]
 | 
			
		||||
            [AM_LDFLAGS="-L$with_lime/lib $AM_LDFLAGS"])
 | 
			
		||||
 | 
			
		||||
############### OpenSSL
 | 
			
		||||
AC_ARG_WITH([openssl],
 | 
			
		||||
            [AS_HELP_STRING([--with-openssl=prefix],
 | 
			
		||||
            [try this for a non-standard install prefix of the OpenSSL library])],
 | 
			
		||||
            [AM_CXXFLAGS="-I$with_openssl/include $AM_CXXFLAGS"]
 | 
			
		||||
            [AM_LDFLAGS="-L$with_openssl/lib $AM_LDFLAGS"])
 | 
			
		||||
 | 
			
		||||
############### lapack
 | 
			
		||||
AC_ARG_ENABLE([lapack],
 | 
			
		||||
    [AC_HELP_STRING([--enable-lapack=yes|no|prefix], [enable LAPACK])],
 | 
			
		||||
@@ -195,13 +188,9 @@ AC_SEARCH_LIBS([fftw_execute], [fftw3],
 | 
			
		||||
AC_SEARCH_LIBS([limeCreateReader], [lime],
 | 
			
		||||
               [AC_DEFINE([HAVE_LIME], [1], [Define to 1 if you have the `LIME' library])]
 | 
			
		||||
               [have_lime=true],
 | 
			
		||||
	             [AC_MSG_ERROR(LIME library was not found in your system.)])
 | 
			
		||||
 | 
			
		||||
AC_SEARCH_LIBS([SHA256_Init], [crypto],
 | 
			
		||||
               [AC_DEFINE([HAVE_CRYPTO], [1], [Define to 1 if you have the `OpenSSL' library])]
 | 
			
		||||
               [have_crypto=true],
 | 
			
		||||
	             [AC_MSG_ERROR(OpenSSL library was not found in your system.)])
 | 
			
		||||
AC_CHECK_HEADER([openssl/sha.h], [], [AC_MSG_ERROR(OpenSSL library found but without headers.)], [AC_INCLUDES_DEFAULT([])])
 | 
			
		||||
	       [AC_MSG_WARN(C-LIME library was not found in your system.
 | 
			
		||||
In order to use ILGG file format please install or provide the correct path to your installation
 | 
			
		||||
Info at: http://usqcd.jlab.org/usqcd-docs/c-lime/)])
 | 
			
		||||
 | 
			
		||||
AC_SEARCH_LIBS([crc32], [z],
 | 
			
		||||
               [AC_DEFINE([HAVE_ZLIB], [1], [Define to 1 if you have the `LIBZ' library])]
 | 
			
		||||
@@ -485,20 +474,18 @@ DX_INIT_DOXYGEN([$PACKAGE_NAME], [doxygen.cfg])
 | 
			
		||||
 | 
			
		||||
############### Ouput
 | 
			
		||||
cwd=`pwd -P`; cd ${srcdir}; abs_srcdir=`pwd -P`; cd ${cwd}
 | 
			
		||||
GRID_CXX="$CXX"
 | 
			
		||||
GRID_CXXFLAGS="$AM_CXXFLAGS $CXXFLAGS"
 | 
			
		||||
GRID_LDFLAGS="$AM_LDFLAGS $LDFLAGS"
 | 
			
		||||
GRID_LIBS=$LIBS
 | 
			
		||||
GRID_SHORT_SHA=`git rev-parse --short HEAD`
 | 
			
		||||
GRID_SHA=`git rev-parse HEAD`
 | 
			
		||||
GRID_BRANCH=`git rev-parse --abbrev-ref HEAD`
 | 
			
		||||
AM_CXXFLAGS="-I${abs_srcdir} $AM_CXXFLAGS"
 | 
			
		||||
AM_CFLAGS="-I${abs_srcdir} $AM_CFLAGS"
 | 
			
		||||
AM_LDFLAGS="-L${cwd}/Grid $AM_LDFLAGS"
 | 
			
		||||
AM_CXXFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/Eigen/  -I${abs_srcdir}/Eigen/unsupported $AM_CXXFLAGS"
 | 
			
		||||
AM_CFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/Eigen/  -I${abs_srcdir}/Eigen/unsupported $AM_CFLAGS"
 | 
			
		||||
AM_LDFLAGS="-L${cwd}/lib $AM_LDFLAGS"
 | 
			
		||||
AC_SUBST([AM_CFLAGS])
 | 
			
		||||
AC_SUBST([AM_CXXFLAGS])
 | 
			
		||||
AC_SUBST([AM_LDFLAGS])
 | 
			
		||||
AC_SUBST([GRID_CXX])
 | 
			
		||||
AC_SUBST([GRID_CXXFLAGS])
 | 
			
		||||
AC_SUBST([GRID_LDFLAGS])
 | 
			
		||||
AC_SUBST([GRID_LIBS])
 | 
			
		||||
@@ -549,7 +536,7 @@ AC_SUBST([GRID_SUMMARY])
 | 
			
		||||
 | 
			
		||||
AC_CONFIG_FILES([grid-config], [chmod +x grid-config])
 | 
			
		||||
AC_CONFIG_FILES(Makefile)
 | 
			
		||||
AC_CONFIG_FILES(Grid/Makefile)
 | 
			
		||||
AC_CONFIG_FILES(lib/Makefile)
 | 
			
		||||
AC_CONFIG_FILES(tests/Makefile)
 | 
			
		||||
AC_CONFIG_FILES(tests/IO/Makefile)
 | 
			
		||||
AC_CONFIG_FILES(tests/core/Makefile)
 | 
			
		||||
@@ -563,8 +550,8 @@ AC_CONFIG_FILES(tests/smearing/Makefile)
 | 
			
		||||
AC_CONFIG_FILES(tests/qdpxx/Makefile)
 | 
			
		||||
AC_CONFIG_FILES(tests/testu01/Makefile)
 | 
			
		||||
AC_CONFIG_FILES(benchmarks/Makefile)
 | 
			
		||||
AC_CONFIG_FILES(Hadrons/Makefile)
 | 
			
		||||
AC_CONFIG_FILES(Hadrons/Utilities/Makefile)
 | 
			
		||||
AC_CONFIG_FILES(extras/Makefile)
 | 
			
		||||
AC_CONFIG_FILES(extras/Hadrons/Makefile)
 | 
			
		||||
AC_OUTPUT
 | 
			
		||||
 | 
			
		||||
echo ""
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							@@ -1,20 +0,0 @@
 | 
			
		||||
# Minimal makefile for Sphinx documentation
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# You can set these variables from the command line.
 | 
			
		||||
SPHINXOPTS    =
 | 
			
		||||
SPHINXBUILD   = sphinx-build
 | 
			
		||||
SPHINXPROJ    = Grid
 | 
			
		||||
SOURCEDIR     = .
 | 
			
		||||
BUILDDIR      = _build
 | 
			
		||||
 | 
			
		||||
# Put it first so that "make" without argument is like "make help".
 | 
			
		||||
help:
 | 
			
		||||
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
 | 
			
		||||
 | 
			
		||||
.PHONY: help Makefile
 | 
			
		||||
 | 
			
		||||
# Catch-all target: route all unknown targets to Sphinx using the new
 | 
			
		||||
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
 | 
			
		||||
%: Makefile
 | 
			
		||||
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
 | 
			
		||||
@@ -1,170 +0,0 @@
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
#
 | 
			
		||||
# Configuration file for the Sphinx documentation builder.
 | 
			
		||||
#
 | 
			
		||||
# This file does only contain a selection of the most common options. For a
 | 
			
		||||
# full list see the documentation:
 | 
			
		||||
# http://www.sphinx-doc.org/en/stable/config
 | 
			
		||||
 | 
			
		||||
# -- Path setup --------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# If extensions (or modules to document with autodoc) are in another directory,
 | 
			
		||||
# add these directories to sys.path here. If the directory is relative to the
 | 
			
		||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
 | 
			
		||||
#
 | 
			
		||||
# import os
 | 
			
		||||
# import sys
 | 
			
		||||
# sys.path.insert(0, os.path.abspath('.'))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- Project information -----------------------------------------------------
 | 
			
		||||
 | 
			
		||||
project = 'Grid'
 | 
			
		||||
copyright = '2018, Peter Boyle, Guido Cossu, Antonin Portelli, Azusa Yamaguchi'
 | 
			
		||||
author = 'Peter Boyle, Guido Cossu, Antonin Portelli, Azusa Yamaguchi'
 | 
			
		||||
 | 
			
		||||
# The short X.Y version
 | 
			
		||||
version = ''
 | 
			
		||||
# The full version, including alpha/beta/rc tags
 | 
			
		||||
release = ''
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- General configuration ---------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# If your documentation needs a minimal Sphinx version, state it here.
 | 
			
		||||
#
 | 
			
		||||
# needs_sphinx = '1.0'
 | 
			
		||||
 | 
			
		||||
# Add any Sphinx extension module names here, as strings. They can be
 | 
			
		||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 | 
			
		||||
# ones.
 | 
			
		||||
extensions = [
 | 
			
		||||
    'sphinx.ext.todo',
 | 
			
		||||
    'sphinx.ext.mathjax',
 | 
			
		||||
    'sphinx.ext.ifconfig',
 | 
			
		||||
    'sphinx.ext.githubpages',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
# Add any paths that contain templates here, relative to this directory.
 | 
			
		||||
templates_path = ['_templates']
 | 
			
		||||
 | 
			
		||||
# The suffix(es) of source filenames.
 | 
			
		||||
# You can specify multiple suffix as a list of string:
 | 
			
		||||
#
 | 
			
		||||
# source_suffix = ['.rst', '.md']
 | 
			
		||||
source_suffix = '.rst'
 | 
			
		||||
 | 
			
		||||
# The master toctree document.
 | 
			
		||||
master_doc = 'manual'
 | 
			
		||||
 | 
			
		||||
# The language for content autogenerated by Sphinx. Refer to documentation
 | 
			
		||||
# for a list of supported languages.
 | 
			
		||||
#
 | 
			
		||||
# This is also used if you do content translation via gettext catalogs.
 | 
			
		||||
# Usually you set "language" from the command line for these cases.
 | 
			
		||||
language = None
 | 
			
		||||
 | 
			
		||||
# List of patterns, relative to source directory, that match files and
 | 
			
		||||
# directories to ignore when looking for source files.
 | 
			
		||||
# This pattern also affects html_static_path and html_extra_path .
 | 
			
		||||
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
 | 
			
		||||
 | 
			
		||||
# The name of the Pygments (syntax highlighting) style to use.
 | 
			
		||||
pygments_style = 'sphinx'
 | 
			
		||||
primary_domain = 'cpp'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- Options for HTML output -------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# The theme to use for HTML and HTML Help pages.  See the documentation for
 | 
			
		||||
# a list of builtin themes.
 | 
			
		||||
#
 | 
			
		||||
html_theme = 'alabaster'
 | 
			
		||||
html_use_smartypants = False
 | 
			
		||||
smart_quotes = False
 | 
			
		||||
# Theme options are theme-specific and customize the look and feel of a theme
 | 
			
		||||
# further.  For a list of options available for each theme, see the
 | 
			
		||||
# documentation.
 | 
			
		||||
#
 | 
			
		||||
# html_theme_options = {}
 | 
			
		||||
 | 
			
		||||
# Add any paths that contain custom static files (such as style sheets) here,
 | 
			
		||||
# relative to this directory. They are copied after the builtin static files,
 | 
			
		||||
# so a file named "default.css" will overwrite the builtin "default.css".
 | 
			
		||||
html_static_path = ['_static']
 | 
			
		||||
 | 
			
		||||
# Custom sidebar templates, must be a dictionary that maps document names
 | 
			
		||||
# to template names.
 | 
			
		||||
#
 | 
			
		||||
# The default sidebars (for documents that don't match any pattern) are
 | 
			
		||||
# defined by theme itself.  Builtin themes are using these templates by
 | 
			
		||||
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
 | 
			
		||||
# 'searchbox.html']``.
 | 
			
		||||
#
 | 
			
		||||
# html_sidebars = {}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- Options for HTMLHelp output ---------------------------------------------
 | 
			
		||||
 | 
			
		||||
# Output file base name for HTML help builder.
 | 
			
		||||
htmlhelp_basename = 'Griddoc'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- Options for LaTeX output ------------------------------------------------
 | 
			
		||||
 | 
			
		||||
latex_elements = {
 | 
			
		||||
    # The paper size ('letterpaper' or 'a4paper').
 | 
			
		||||
    #
 | 
			
		||||
    #'papersize': 'a4paper',
 | 
			
		||||
 | 
			
		||||
    'extraclassoptions': 'openany,oneside',
 | 
			
		||||
 | 
			
		||||
    # The font size ('10pt', '11pt' or '12pt').
 | 
			
		||||
    #
 | 
			
		||||
    'pointsize': '8pt',
 | 
			
		||||
 | 
			
		||||
    # Additional stuff for the LaTeX preamble.
 | 
			
		||||
    #
 | 
			
		||||
    
 | 
			
		||||
    # Latex figure (float) alignment
 | 
			
		||||
    #
 | 
			
		||||
    'figure_align': 'htbp',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Grouping the document tree into LaTeX files. List of tuples
 | 
			
		||||
# (source start file, target name, title,
 | 
			
		||||
#  author, documentclass [howto, manual, or own class]).
 | 
			
		||||
latex_documents = [
 | 
			
		||||
    (master_doc, 'Grid.tex', ' Grid Documentation ',
 | 
			
		||||
     '\includegraphics[width=.4\\textwidth]{logo.png} \\\\Peter Boyle, Guido Cossu, Antonin Portelli, Azusa Yamaguchi', 'manual'),
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- Options for manual page output ------------------------------------------
 | 
			
		||||
 | 
			
		||||
# One entry per manual page. List of tuples
 | 
			
		||||
# (source start file, name, description, authors, manual section).
 | 
			
		||||
man_pages = [
 | 
			
		||||
    (master_doc, 'grid', 'Grid Documentation',
 | 
			
		||||
     [author], 1)
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- Options for Texinfo output ----------------------------------------------
 | 
			
		||||
 | 
			
		||||
# Grouping the document tree into Texinfo files. List of tuples
 | 
			
		||||
# (source start file, target name, title, author,
 | 
			
		||||
#  dir menu entry, description, category)
 | 
			
		||||
texinfo_documents = [
 | 
			
		||||
    (master_doc, 'Grid', 'Grid Documentation',
 | 
			
		||||
     author, 'Grid', 'One line description of project.',
 | 
			
		||||
     'Miscellaneous'),
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- Extension configuration -------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# -- Options for todo extension ----------------------------------------------
 | 
			
		||||
 | 
			
		||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
 | 
			
		||||
todo_include_todos = True
 | 
			
		||||
@@ -1,232 +0,0 @@
 | 
			
		||||
Interfacing with external software
 | 
			
		||||
========================================
 | 
			
		||||
 | 
			
		||||
Grid provides a number of important modules, such as solvers and
 | 
			
		||||
eigensolvers, that are highly optimized for complex vector/SIMD
 | 
			
		||||
architectures, such as the Intel Xeon Phi KNL and Skylake processors.
 | 
			
		||||
This growing library, with appropriate interfacing, can be accessed
 | 
			
		||||
from existing code. Here we describe interfacing issues and provide
 | 
			
		||||
examples.
 | 
			
		||||
 | 
			
		||||
	  
 | 
			
		||||
MPI initialization
 | 
			
		||||
--------------------
 | 
			
		||||
 | 
			
		||||
Grid supports threaded MPI sends and receives and, if running with
 | 
			
		||||
more than one thread, requires the MPI_THREAD_MULTIPLE mode of message
 | 
			
		||||
passing. If the user initializes MPI before starting Grid, the
 | 
			
		||||
appropriate initialization call is::
 | 
			
		||||
 | 
			
		||||
  MPI_Init_thread(argc, argv, MPI_THREAD_MULTIPLE, &provided);
 | 
			
		||||
  assert(MPI_THREAD_MULTIPLE == provided);
 | 
			
		||||
 | 
			
		||||
Grid Initialization
 | 
			
		||||
---------------------
 | 
			
		||||
 | 
			
		||||
Grid itself is initialized with a call::
 | 
			
		||||
 | 
			
		||||
  Grid_init(&argc, &argv);
 | 
			
		||||
 | 
			
		||||
Command line options include::
 | 
			
		||||
 | 
			
		||||
  --mpi n.n.n.n   : default MPI decomposition
 | 
			
		||||
  --threads n     : default number of OMP threads
 | 
			
		||||
  --grid n.n.n.n  : default Grid size
 | 
			
		||||
  
 | 
			
		||||
where `argc` and `argv` are constructed to simulate the command-line
 | 
			
		||||
options described above.  At a minimum one usually provides the
 | 
			
		||||
`--grid` and `--mpi` parameters.  The former specifies the lattice
 | 
			
		||||
dimensions and the latter specifies the grid of processors (MPI
 | 
			
		||||
ranks).  If these parameters are not specified with the `Grid_init`
 | 
			
		||||
call, they need to be supplied later when creating Grid fields.
 | 
			
		||||
 | 
			
		||||
The following Grid procedures are useful for verifying that Grid
 | 
			
		||||
"default" values are properly initialized.
 | 
			
		||||
 | 
			
		||||
=============================================================   ===========================================================================================================
 | 
			
		||||
  Grid procedure                                                  returns 
 | 
			
		||||
=============================================================   ===========================================================================================================
 | 
			
		||||
  std::vector<int> GridDefaultLatt();                            lattice size
 | 
			
		||||
  std::vector<int> GridDefaultSimd(int Nd,vComplex::Nsimd());    SIMD layout
 | 
			
		||||
  std::vector<int> GridDefaultMpi();                             MPI layout
 | 
			
		||||
  int Grid::GridThread::GetThreads();                            number of threads
 | 
			
		||||
=============================================================   ===========================================================================================================
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
MPI coordination
 | 
			
		||||
----------------
 | 
			
		||||
 | 
			
		||||
Grid wants to use its own numbering of MPI ranks and its own
 | 
			
		||||
assignment of the lattice coordinates with each rank.  Obviously, the
 | 
			
		||||
calling program and Grid must agree on these conventions.  One should
 | 
			
		||||
use Grid's Cartesian communicator class to discover the processor
 | 
			
		||||
assignments. For a four-dimensional processor grid one can define::
 | 
			
		||||
 | 
			
		||||
  static Grid::CartesianCommunicator *grid_cart = NULL;
 | 
			
		||||
  grid_cart = new Grid::CartesianCommunicator(processors);
 | 
			
		||||
 | 
			
		||||
where `processors` is of type `std::vector<int>`, with values matching
 | 
			
		||||
the MPI processor-layout dimensions specified with the `--mpi`
 | 
			
		||||
argument in the `Grid_Init` call.  Then each MPI rank can obtain its
 | 
			
		||||
processor coordinate using the Cartesian communicator instantiated
 | 
			
		||||
above.  For example, in four dimensions::
 | 
			
		||||
 | 
			
		||||
  std::vector<int> pePos(4);    
 | 
			
		||||
  for(int i=0; i<4; i++)
 | 
			
		||||
     pePos[i] = grid_cart->_processor_coor[i];
 | 
			
		||||
 | 
			
		||||
and each MPI process can get its world rank from its processor
 | 
			
		||||
coordinates using::
 | 
			
		||||
 | 
			
		||||
  int peRank = grid_cart->RankFromProcessorCoor(pePos)
 | 
			
		||||
	  
 | 
			
		||||
Conversely, each MPI process can get its processor coordinates from
 | 
			
		||||
its world rank using::
 | 
			
		||||
 | 
			
		||||
  grid_cart->ProcessorCoorFromRank(peRank, pePos);
 | 
			
		||||
 | 
			
		||||
If the calling program initialized MPI before initializing Grid, it is
 | 
			
		||||
then important for each MPI process in the calling program to reset
 | 
			
		||||
its rank number so it agrees with Grid::
 | 
			
		||||
 | 
			
		||||
   MPI_Comm comm;
 | 
			
		||||
   MPI_Comm_split(MPI_COMM_THISJOB,jobid,peRank,&comm);
 | 
			
		||||
   MPI_COMM_THISJOB = comm;
 | 
			
		||||
 | 
			
		||||
where `MPI_COMM_THISJOB` is initially a copy of `MPI_COMM_WORLD` (with
 | 
			
		||||
`jobid = 0`), or it is a split communicator with `jobid` equal to the
 | 
			
		||||
index number of the subcommunicator.  Once this is done,::
 | 
			
		||||
 | 
			
		||||
  MPI_Comm_rank(MPI_COMM_THISJOB, &myrank);
 | 
			
		||||
 | 
			
		||||
returns a rank that agrees with Grid's `peRank`.
 | 
			
		||||
 | 
			
		||||
QMP coordination
 | 
			
		||||
----------------
 | 
			
		||||
 | 
			
		||||
If the calling program uses the SciDAC QMP message-passing package, a
 | 
			
		||||
call to QMP_comm_split() instead can be used to reassign the ranks.
 | 
			
		||||
In the example below, `peGrid` gives the processor-grid dimensions,
 | 
			
		||||
usually set on the command line with `-qmp-geom`.
 | 
			
		||||
 | 
			
		||||
**Example**::
 | 
			
		||||
  
 | 
			
		||||
  int NDIM = QMP_get_allocated_number_of_dimensions();
 | 
			
		||||
  Grid::Grid_init(argc,argv);
 | 
			
		||||
  FgridBase::grid_initted=true;
 | 
			
		||||
  std::vector<int> processors;
 | 
			
		||||
  for(int i=0;i<NDIM;i++) processors.push_back(peGrid[i]);
 | 
			
		||||
  Grid::CartesianCommunicator grid_cart(processors);
 | 
			
		||||
  std::vector<int> pePos(NDIM);
 | 
			
		||||
  for(int i=NDIM-1;i>=0;i--)
 | 
			
		||||
     pePos[i] = grid_cart._processor_coor[i];
 | 
			
		||||
  int peRank = grid_cart->RankFromProcessorCoor(pePos);
 | 
			
		||||
  QMP_comm_split(QMP_comm_get_default(),0,peRank,&qmp_comm);
 | 
			
		||||
  QMP_comm_set_default(qmp_comm);
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
Mapping fields between Grid and user layouts
 | 
			
		||||
---------------------------------------------
 | 
			
		||||
 | 
			
		||||
In order to map data between calling-program and Grid layouts, it is
 | 
			
		||||
important to know how the lattice sites are distributed across the
 | 
			
		||||
processor grid.  A lattice site with coordinates `r[mu]` is assigned
 | 
			
		||||
to the processor with processor coordinates `pePos[mu]` according to
 | 
			
		||||
the rule::
 | 
			
		||||
 | 
			
		||||
  pePos[mu] = r[mu]/dim[mu]
 | 
			
		||||
 | 
			
		||||
where `dim[mu]` is the lattice dimension in the `mu` direction.  For
 | 
			
		||||
performance reasons, it is important that the external data layout
 | 
			
		||||
follow the same rule.  Then data mapping can be done without
 | 
			
		||||
requiring costly communication between ranks.  We assume this is the
 | 
			
		||||
case here.
 | 
			
		||||
 | 
			
		||||
When mapping data to and from Grid, one must choose a lattice object
 | 
			
		||||
defined on the appropriate grid, whether it be a full lattice (4D
 | 
			
		||||
`GridCartesian`), one of the checkerboards (4D
 | 
			
		||||
`GridRedBlackCartesian`), a five-dimensional full grid (5D
 | 
			
		||||
`GridCartesian`), or a five-dimensional checkerboard (5D
 | 
			
		||||
`GridRedBlackCartesian`).  For example, an improved staggered-fermion
 | 
			
		||||
color-vector field `cv` on a single checkerboard would be constructed
 | 
			
		||||
using
 | 
			
		||||
 | 
			
		||||
**Example**::
 | 
			
		||||
 | 
			
		||||
  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(&Grid);
 | 
			
		||||
 | 
			
		||||
  typename ImprovedStaggeredFermion::FermionField  cv(RBGrid);
 | 
			
		||||
 | 
			
		||||
The example above assumes that the grid default values were set in the
 | 
			
		||||
`Grid_init` call.  If not, they can be set at this point and passed
 | 
			
		||||
when `GridCartesian` is instantiated here.  To map data within an MPI
 | 
			
		||||
rank, the external code must iterate over the sites belonging to that
 | 
			
		||||
rank (full or checkerboard as appropriate).  Note that the site
 | 
			
		||||
coordinates are specified relative to the origin of the lattice
 | 
			
		||||
subvolume on that rank. To import data into Grid, the external data on
 | 
			
		||||
a single site with coordinates `r` is first copied into the
 | 
			
		||||
appropriate Grid scalar object `s`.  Then it is copied into the Grid
 | 
			
		||||
lattice field `l` with `pokeLocalSite`::
 | 
			
		||||
 | 
			
		||||
  pokeLocalSite(const sobj &s, Lattice<vobj> &l, Coordinate &r);
 | 
			
		||||
 | 
			
		||||
To export data from Grid, the reverse operation starts with::
 | 
			
		||||
 | 
			
		||||
  peekLocalSite(const sobj &s, Lattice<vobj> &l, Coordinate &r);
 | 
			
		||||
 | 
			
		||||
and then copies the single-site data from `s` into the corresponding
 | 
			
		||||
external type.
 | 
			
		||||
 | 
			
		||||
Here is an example that maps a single site's worth of data in a MILC
 | 
			
		||||
color-vector field to a Grid scalar ColourVector object `cVec` and from
 | 
			
		||||
there to the lattice colour-vector field `cv`, as defined above.
 | 
			
		||||
 | 
			
		||||
**Example**::
 | 
			
		||||
 | 
			
		||||
  indexToCoords(idx,r);
 | 
			
		||||
  ColourVector cVec;
 | 
			
		||||
  for(int col=0; col<Nc; col++)
 | 
			
		||||
      cVec()()(col) = 
 | 
			
		||||
          Complex(src[idx].c[col].real, src[idx].c[col].imag);
 | 
			
		||||
 | 
			
		||||
  pokeLocalSite(cVec, cv, r);
 | 
			
		||||
 | 
			
		||||
Here the `indexToCoords()` function is a MILC mapping of the MILC site
 | 
			
		||||
index `idx` to the 4D lattice coordinate `r`.
 | 
			
		||||
 | 
			
		||||
Grid provides block- and multiple-rhs conjugate-gradient solvers. For
 | 
			
		||||
this purpose it uses a 5D lattice. To map data to and from Grid data
 | 
			
		||||
types, the index for the right-hand-side vector becomes the zeroth
 | 
			
		||||
coordinate of a five-dimensional vector `r5`.  The remaining
 | 
			
		||||
components of `r5` contain the 4D space-time coordinates.  The
 | 
			
		||||
`pokeLocalSite/peekLocalSite` operations then accept the coordinate
 | 
			
		||||
`r5`, provided the destination/source lattice object is also 5D.  In
 | 
			
		||||
the example below data from a single site specified by `idx`,
 | 
			
		||||
belonging to a set of `Ls` MILC color-vector fields, are copied into a
 | 
			
		||||
Grid 5D fermion field `cv5`.
 | 
			
		||||
 | 
			
		||||
**Example**::
 | 
			
		||||
 | 
			
		||||
    GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt();
 | 
			
		||||
    GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid)  typename ImprovedStaggeredFermion5D::FermionField  cv5(FrbGrid);
 | 
			
		||||
 | 
			
		||||
    std::vector<int> r(4);
 | 
			
		||||
    indexToCoords(idx,r);
 | 
			
		||||
    std::vector<int> r5(1,0);
 | 
			
		||||
    for( int d = 0; d < 4; d++ ) r5.push_back(r[d]);
 | 
			
		||||
 | 
			
		||||
    for( int j = 0; j < Ls; j++ ){
 | 
			
		||||
      r5[0] = j;
 | 
			
		||||
      ColourVector cVec;
 | 
			
		||||
      for(int col=0; col<Nc; col++){
 | 
			
		||||
	  cVec()()(col) = 
 | 
			
		||||
	      Complex(src[j][idx].c[col].real, src[j][idx].c[col].imag);
 | 
			
		||||
      }
 | 
			
		||||
      pokeLocalSite(cVec, *(out->cv), r5);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 216 KiB  | 
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										146
									
								
								extras/Hadrons/AllToAllReduction.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								extras/Hadrons/AllToAllReduction.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,146 @@
 | 
			
		||||
#ifndef A2A_Reduction_hpp_
 | 
			
		||||
#define A2A_Reduction_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Environment.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Solver.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////
 | 
			
		||||
// A2A Meson Field Inner Product
 | 
			
		||||
////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
template <class FermionField>
 | 
			
		||||
void sliceInnerProductMesonField(std::vector<std::vector<ComplexD>> &mat,
 | 
			
		||||
                                 const std::vector<Lattice<FermionField>> &lhs,
 | 
			
		||||
                                 const std::vector<Lattice<FermionField>> &rhs,
 | 
			
		||||
                                 int orthogdim)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename FermionField::scalar_type scalar_type;
 | 
			
		||||
    typedef typename FermionField::vector_type vector_type;
 | 
			
		||||
 | 
			
		||||
    int Lblock = lhs.size();
 | 
			
		||||
    int Rblock = rhs.size();
 | 
			
		||||
 | 
			
		||||
    GridBase *grid = lhs[0]._grid;
 | 
			
		||||
 | 
			
		||||
    const int Nd = grid->_ndimension;
 | 
			
		||||
    const int Nsimd = grid->Nsimd();
 | 
			
		||||
    int Nt = grid->GlobalDimensions()[orthogdim];
 | 
			
		||||
 | 
			
		||||
    assert(mat.size() == Lblock * Rblock);
 | 
			
		||||
    for (int t = 0; t < mat.size(); t++)
 | 
			
		||||
    {
 | 
			
		||||
        assert(mat[t].size() == Nt);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int fd = grid->_fdimensions[orthogdim];
 | 
			
		||||
    int ld = grid->_ldimensions[orthogdim];
 | 
			
		||||
    int rd = grid->_rdimensions[orthogdim];
 | 
			
		||||
 | 
			
		||||
    // will locally sum vectors first
 | 
			
		||||
    // sum across these down to scalars
 | 
			
		||||
    // splitting the SIMD
 | 
			
		||||
    std::vector<vector_type, alignedAllocator<vector_type>> lvSum(rd * Lblock * Rblock);
 | 
			
		||||
    for(int r=0;r<rd * Lblock * Rblock;r++)
 | 
			
		||||
    {
 | 
			
		||||
        lvSum[r]=zero;
 | 
			
		||||
    }
 | 
			
		||||
    std::vector<scalar_type> lsSum(ld * Lblock * Rblock, scalar_type(0.0));
 | 
			
		||||
 | 
			
		||||
    int e1 = grid->_slice_nblock[orthogdim];
 | 
			
		||||
    int e2 = grid->_slice_block[orthogdim];
 | 
			
		||||
    int stride = grid->_slice_stride[orthogdim];
 | 
			
		||||
 | 
			
		||||
    // std::cout << GridLogMessage << " Entering first parallel loop " << std::endl;
 | 
			
		||||
    // Parallelise over t-direction doesn't expose as much parallelism as needed for KNL
 | 
			
		||||
    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;
 | 
			
		||||
                for (int i = 0; i < Lblock; i++)
 | 
			
		||||
                {
 | 
			
		||||
                    auto left = conjugate(lhs[i]._odata[ss]);
 | 
			
		||||
                    for (int j = 0; j < Rblock; j++)
 | 
			
		||||
                    {
 | 
			
		||||
                        int idx = i + Lblock * j + Lblock * Rblock * r;
 | 
			
		||||
                        auto right = rhs[j]._odata[ss];
 | 
			
		||||
                        vector_type vv = left()(0)(0) * right()(0)(0) 
 | 
			
		||||
                                       + left()(0)(1) * right()(0)(1) 
 | 
			
		||||
                                       + left()(0)(2) * right()(0)(2) 
 | 
			
		||||
                                       + left()(1)(0) * right()(1)(0) 
 | 
			
		||||
                                       + left()(1)(1) * right()(1)(1) 
 | 
			
		||||
                                       + left()(1)(2) * right()(1)(2) 
 | 
			
		||||
                                       + left()(2)(0) * right()(2)(0) 
 | 
			
		||||
                                       + left()(2)(1) * right()(2)(1) 
 | 
			
		||||
                                       + left()(2)(2) * right()(2)(2) 
 | 
			
		||||
                                       + left()(3)(0) * right()(3)(0) 
 | 
			
		||||
                                       + left()(3)(1) * right()(3)(1) 
 | 
			
		||||
                                       + left()(3)(2) * right()(3)(2);
 | 
			
		||||
 | 
			
		||||
                        lvSum[idx] = lvSum[idx] + vv;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // std::cout << GridLogMessage << " Entering second parallel loop " << std::endl;
 | 
			
		||||
    // Sum across simd lanes in the plane, breaking out orthog dir.
 | 
			
		||||
    parallel_for(int rt = 0; rt < rd; rt++)
 | 
			
		||||
    {
 | 
			
		||||
        std::vector<int> icoor(Nd);
 | 
			
		||||
        for (int i = 0; i < Lblock; i++)
 | 
			
		||||
        {
 | 
			
		||||
            for (int j = 0; j < Rblock; j++)
 | 
			
		||||
            {
 | 
			
		||||
                iScalar<vector_type> temp;
 | 
			
		||||
                std::vector<iScalar<scalar_type>> extracted(Nsimd);
 | 
			
		||||
                temp._internal = lvSum[i + Lblock * j + Lblock * Rblock * rt];
 | 
			
		||||
                extract(temp, extracted);
 | 
			
		||||
                for (int idx = 0; idx < Nsimd; idx++)
 | 
			
		||||
                {
 | 
			
		||||
                    grid->iCoorFromIindex(icoor, idx);
 | 
			
		||||
                    int ldx = rt + icoor[orthogdim] * rd;
 | 
			
		||||
                    int ij_dx = i + Lblock * j + Lblock * Rblock * ldx;
 | 
			
		||||
                    lsSum[ij_dx] = lsSum[ij_dx] + extracted[idx]._internal;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // std::cout << GridLogMessage << " Entering non parallel loop " << std::endl;
 | 
			
		||||
    for (int t = 0; t < fd; t++)
 | 
			
		||||
    {
 | 
			
		||||
        int pt = t/ld; // processor plane
 | 
			
		||||
        int lt = t%ld;
 | 
			
		||||
        for (int i = 0; i < Lblock; i++)
 | 
			
		||||
        {
 | 
			
		||||
            for (int j = 0; j < Rblock; j++)
 | 
			
		||||
            {
 | 
			
		||||
                if (pt == grid->_processor_coor[orthogdim])
 | 
			
		||||
                {
 | 
			
		||||
                    int ij_dx = i + Lblock * j + Lblock * Rblock * lt;
 | 
			
		||||
                    mat[i + j * Lblock][t] = lsSum[ij_dx];
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    mat[i + j * Lblock][t] = scalar_type(0.0);
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    // std::cout << GridLogMessage << " Done " << std::endl;
 | 
			
		||||
    // defer sum over nodes.
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // A2A_Reduction_hpp_
 | 
			
		||||
							
								
								
									
										210
									
								
								extras/Hadrons/AllToAllVectors.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								extras/Hadrons/AllToAllVectors.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,210 @@
 | 
			
		||||
#ifndef A2A_Vectors_hpp_
 | 
			
		||||
#define A2A_Vectors_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Environment.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Solver.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
////////////////////////////////
 | 
			
		||||
// A2A Modes
 | 
			
		||||
////////////////////////////////
 | 
			
		||||
 | 
			
		||||
template <class Field, class Matrix, class Solver>
 | 
			
		||||
class A2AModesSchurDiagTwo
 | 
			
		||||
{
 | 
			
		||||
  private:
 | 
			
		||||
    const std::vector<Field> *evec;
 | 
			
		||||
    const std::vector<RealD> *eval;
 | 
			
		||||
    Matrix &action;
 | 
			
		||||
    Solver &solver;
 | 
			
		||||
    std::vector<Field> w_high_5d, v_high_5d, w_high_4d, v_high_4d;
 | 
			
		||||
    const int Nl, Nh;
 | 
			
		||||
    const bool return_5d;
 | 
			
		||||
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
  int getNl (void ) {return Nl;}
 | 
			
		||||
  int getNh (void ) {return Nh;}
 | 
			
		||||
  int getN  (void ) {return Nh+Nl;}
 | 
			
		||||
 | 
			
		||||
    A2AModesSchurDiagTwo(const std::vector<Field> *_evec, const std::vector<RealD> *_eval,
 | 
			
		||||
                         Matrix &_action,
 | 
			
		||||
                         Solver &_solver,
 | 
			
		||||
                         std::vector<Field> _w_high_5d, std::vector<Field> _v_high_5d,
 | 
			
		||||
                         std::vector<Field> _w_high_4d, std::vector<Field> _v_high_4d,
 | 
			
		||||
                         const int _Nl, const int _Nh,
 | 
			
		||||
                         const bool _return_5d)
 | 
			
		||||
                        : evec(_evec), eval(_eval),
 | 
			
		||||
                        action(_action),
 | 
			
		||||
                        solver(_solver),
 | 
			
		||||
                        w_high_5d(_w_high_5d), v_high_5d(_v_high_5d),
 | 
			
		||||
                        w_high_4d(_w_high_4d), v_high_4d(_v_high_4d),
 | 
			
		||||
                        Nl(_Nl), Nh(_Nh),
 | 
			
		||||
                        return_5d(_return_5d){};
 | 
			
		||||
 | 
			
		||||
    void high_modes(Field &source_5d, Field &w_source_5d, Field &source_4d, int i)
 | 
			
		||||
    {
 | 
			
		||||
        int i5d;
 | 
			
		||||
        LOG(Message) << "A2A high modes for i = " << i << std::endl;
 | 
			
		||||
        i5d = 0;
 | 
			
		||||
        if (return_5d) i5d = i;
 | 
			
		||||
        this->high_mode_v(action, solver, source_5d, v_high_5d[i5d], v_high_4d[i]);
 | 
			
		||||
        this->high_mode_w(w_source_5d, source_4d, w_high_5d[i5d], w_high_4d[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void return_v(int i, Field &vout_5d, Field &vout_4d)
 | 
			
		||||
    {
 | 
			
		||||
        if (i < Nl)
 | 
			
		||||
        {
 | 
			
		||||
            this->low_mode_v(action, evec->at(i), eval->at(i), vout_5d, vout_4d);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            vout_4d = v_high_4d[i - Nl];
 | 
			
		||||
            if (!(return_5d)) i = Nl;
 | 
			
		||||
            vout_5d = v_high_5d[i - Nl];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    void return_w(int i, Field &wout_5d, Field &wout_4d)
 | 
			
		||||
    {
 | 
			
		||||
        if (i < Nl)
 | 
			
		||||
        {
 | 
			
		||||
            this->low_mode_w(action, evec->at(i), eval->at(i), wout_5d, wout_4d);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            wout_4d = w_high_4d[i - Nl];
 | 
			
		||||
            if (!(return_5d)) i = Nl;
 | 
			
		||||
            wout_5d = w_high_5d[i - Nl];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void low_mode_v(Matrix &action, const Field &evec, const RealD &eval, Field &vout_5d, Field &vout_4d)
 | 
			
		||||
    {
 | 
			
		||||
        GridBase *grid = action.RedBlackGrid();
 | 
			
		||||
        Field src_o(grid);
 | 
			
		||||
        Field sol_e(grid);
 | 
			
		||||
        Field sol_o(grid);
 | 
			
		||||
        Field tmp(grid);
 | 
			
		||||
 | 
			
		||||
        src_o = evec;
 | 
			
		||||
        src_o.checkerboard = Odd;
 | 
			
		||||
        pickCheckerboard(Even, sol_e, vout_5d);
 | 
			
		||||
        pickCheckerboard(Odd, sol_o, vout_5d);
 | 
			
		||||
 | 
			
		||||
        /////////////////////////////////////////////////////
 | 
			
		||||
        // v_ie = -(1/eval_i) * MeeInv Meo MooInv evec_i
 | 
			
		||||
        /////////////////////////////////////////////////////
 | 
			
		||||
        action.MooeeInv(src_o, tmp);
 | 
			
		||||
        assert(tmp.checkerboard == Odd);
 | 
			
		||||
        action.Meooe(tmp, sol_e);
 | 
			
		||||
        assert(sol_e.checkerboard == Even);
 | 
			
		||||
        action.MooeeInv(sol_e, tmp);
 | 
			
		||||
        assert(tmp.checkerboard == Even);
 | 
			
		||||
        sol_e = (-1.0 / eval) * tmp;
 | 
			
		||||
        assert(sol_e.checkerboard == Even);
 | 
			
		||||
 | 
			
		||||
        /////////////////////////////////////////////////////
 | 
			
		||||
        // v_io = (1/eval_i) * MooInv evec_i
 | 
			
		||||
        /////////////////////////////////////////////////////
 | 
			
		||||
        action.MooeeInv(src_o, tmp);
 | 
			
		||||
        assert(tmp.checkerboard == Odd);
 | 
			
		||||
        sol_o = (1.0 / eval) * tmp;
 | 
			
		||||
        assert(sol_o.checkerboard == Odd);
 | 
			
		||||
 | 
			
		||||
        setCheckerboard(vout_5d, sol_e);
 | 
			
		||||
        assert(sol_e.checkerboard == Even);
 | 
			
		||||
        setCheckerboard(vout_5d, sol_o);
 | 
			
		||||
        assert(sol_o.checkerboard == Odd);
 | 
			
		||||
 | 
			
		||||
        action.ExportPhysicalFermionSolution(vout_5d, vout_4d);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void low_mode_w(Matrix &action, const Field &evec, const RealD &eval, Field &wout_5d, Field &wout_4d)
 | 
			
		||||
    {
 | 
			
		||||
        GridBase *grid = action.RedBlackGrid();
 | 
			
		||||
        SchurDiagTwoOperator<Matrix, Field> _HermOpEO(action);
 | 
			
		||||
 | 
			
		||||
        Field src_o(grid);
 | 
			
		||||
        Field sol_e(grid);
 | 
			
		||||
        Field sol_o(grid);
 | 
			
		||||
        Field tmp(grid);
 | 
			
		||||
 | 
			
		||||
        GridBase *fgrid = action.Grid();
 | 
			
		||||
        Field tmp_wout(fgrid);
 | 
			
		||||
 | 
			
		||||
        src_o = evec;
 | 
			
		||||
        src_o.checkerboard = Odd;
 | 
			
		||||
        pickCheckerboard(Even, sol_e, tmp_wout);
 | 
			
		||||
        pickCheckerboard(Odd, sol_o, tmp_wout);
 | 
			
		||||
 | 
			
		||||
        /////////////////////////////////////////////////////
 | 
			
		||||
        // w_ie = - MeeInvDag MoeDag Doo evec_i
 | 
			
		||||
        /////////////////////////////////////////////////////
 | 
			
		||||
        _HermOpEO.Mpc(src_o, tmp);
 | 
			
		||||
        assert(tmp.checkerboard == Odd);
 | 
			
		||||
        action.MeooeDag(tmp, sol_e);
 | 
			
		||||
        assert(sol_e.checkerboard == Even);
 | 
			
		||||
        action.MooeeInvDag(sol_e, tmp);
 | 
			
		||||
        assert(tmp.checkerboard == Even);
 | 
			
		||||
        sol_e = (-1.0) * tmp;
 | 
			
		||||
 | 
			
		||||
        /////////////////////////////////////////////////////
 | 
			
		||||
        // w_io = Doo evec_i
 | 
			
		||||
        /////////////////////////////////////////////////////
 | 
			
		||||
        _HermOpEO.Mpc(src_o, sol_o);
 | 
			
		||||
        assert(sol_o.checkerboard == Odd);
 | 
			
		||||
 | 
			
		||||
        setCheckerboard(tmp_wout, sol_e);
 | 
			
		||||
        assert(sol_e.checkerboard == Even);
 | 
			
		||||
        setCheckerboard(tmp_wout, sol_o);
 | 
			
		||||
        assert(sol_o.checkerboard == Odd);
 | 
			
		||||
 | 
			
		||||
        action.DminusDag(tmp_wout, wout_5d);
 | 
			
		||||
 | 
			
		||||
        action.ExportPhysicalFermionSource(wout_5d, wout_4d);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void high_mode_v(Matrix &action, Solver &solver, const Field &source, Field &vout_5d, Field &vout_4d)
 | 
			
		||||
    {
 | 
			
		||||
        GridBase *fgrid = action.Grid();
 | 
			
		||||
        solver(vout_5d, source); // Note: solver is solver(out, in)
 | 
			
		||||
        action.ExportPhysicalFermionSolution(vout_5d, vout_4d);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void high_mode_w(const Field &w_source_5d, const Field &source_4d, Field &wout_5d, Field &wout_4d)
 | 
			
		||||
    {
 | 
			
		||||
        wout_5d = w_source_5d;
 | 
			
		||||
        wout_4d = source_4d;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// TODO: A2A for coarse eigenvectors
 | 
			
		||||
 | 
			
		||||
// template <class FineField, class CoarseField, class Matrix, class Solver>
 | 
			
		||||
// class A2ALMSchurDiagTwoCoarse : public A2AModesSchurDiagTwo<FineField, Matrix, Solver>
 | 
			
		||||
// {
 | 
			
		||||
//   private:
 | 
			
		||||
//     const std::vector<FineField> &subspace;
 | 
			
		||||
//     const std::vector<CoarseField> &evec_coarse;
 | 
			
		||||
//     const std::vector<RealD> &eval_coarse;
 | 
			
		||||
//     Matrix &action;
 | 
			
		||||
 | 
			
		||||
//   public:
 | 
			
		||||
//     A2ALMSchurDiagTwoCoarse(const std::vector<FineField> &_subspace, const std::vector<CoarseField> &_evec_coarse, const std::vector<RealD> &_eval_coarse, Matrix &_action)
 | 
			
		||||
//         : subspace(_subspace), evec_coarse(_evec_coarse), eval_coarse(_eval_coarse), action(_action){};
 | 
			
		||||
 | 
			
		||||
//     void operator()(int i, FineField &vout, FineField &wout)
 | 
			
		||||
//     {
 | 
			
		||||
//         FineField prom_evec(subspace[0]._grid);
 | 
			
		||||
//         blockPromote(evec_coarse[i], prom_evec, subspace);
 | 
			
		||||
//         this->low_mode_v(action, prom_evec, eval_coarse[i], vout);
 | 
			
		||||
//         this->low_mode_w(action, prom_evec, eval_coarse[i], wout);
 | 
			
		||||
//     }
 | 
			
		||||
// };
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // A2A_Vectors_hpp_
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Application.cc
 | 
			
		||||
Source file: extras/Hadrons/Application.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -26,16 +26,16 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Application.hpp>
 | 
			
		||||
#include <Hadrons/GeneticScheduler.hpp>
 | 
			
		||||
#include <Hadrons/Modules.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Application.hpp>
 | 
			
		||||
#include <Grid/Hadrons/GeneticScheduler.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace QCD;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
 | 
			
		||||
#define BIG_SEP "================"
 | 
			
		||||
#define SEP     "----------------"
 | 
			
		||||
#define BIG_SEP "==============="
 | 
			
		||||
#define SEP     "---------------"
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                       Application implementation                           *
 | 
			
		||||
@@ -54,18 +54,18 @@ Application::Application(void)
 | 
			
		||||
        loc[d]  /= mpi[d];
 | 
			
		||||
        locVol_ *= loc[d];
 | 
			
		||||
    }
 | 
			
		||||
    LOG(Message) << "====== HADRONS APPLICATION INITIALISATION ======" << std::endl;
 | 
			
		||||
    LOG(Message) << "====== HADRONS APPLICATION STARTING ======" << std::endl;
 | 
			
		||||
    LOG(Message) << "** Dimensions" << std::endl;
 | 
			
		||||
    LOG(Message) << "Global lattice       : " << dim << std::endl;
 | 
			
		||||
    LOG(Message) << "MPI partition        : " << mpi << std::endl;
 | 
			
		||||
    LOG(Message) << "Local lattice        : " << loc << std::endl;
 | 
			
		||||
    LOG(Message) << std::endl;
 | 
			
		||||
    LOG(Message) << "** Default parameters (and associated C macros)" << std::endl;
 | 
			
		||||
    LOG(Message) << "** Default parameters (and associated C macro)" << std::endl;
 | 
			
		||||
    LOG(Message) << "ASCII output precision  : " << MACOUT(DEFAULT_ASCII_PREC) << std::endl;
 | 
			
		||||
    LOG(Message) << "Fermion implementation  : " << MACOUTS(FIMPLBASE) << std::endl;
 | 
			
		||||
    LOG(Message) << "z-Fermion implementation: " << MACOUTS(ZFIMPLBASE) << std::endl;
 | 
			
		||||
    LOG(Message) << "Scalar implementation   : " << MACOUTS(SIMPLBASE) << std::endl;
 | 
			
		||||
    LOG(Message) << "Gauge implementation    : " << MACOUTS(GIMPLBASE) << std::endl;
 | 
			
		||||
    LOG(Message) << "Fermion implementation  : " << MACOUTS(FIMPL) << std::endl;
 | 
			
		||||
    LOG(Message) << "z-Fermion implementation: " << MACOUTS(ZFIMPL) << std::endl;
 | 
			
		||||
    LOG(Message) << "Scalar implementation   : " << MACOUTS(SIMPL) << std::endl;
 | 
			
		||||
    LOG(Message) << "Gauge implementation    : " << MACOUTS(GIMPL) << std::endl;
 | 
			
		||||
    LOG(Message) << "Eigenvector base size   : " 
 | 
			
		||||
                 << MACOUT(HADRONS_DEFAULT_LANCZOS_NBASIS) << std::endl;
 | 
			
		||||
    LOG(Message) << "Schur decomposition     : " << MACOUTS(HADRONS_DEFAULT_SCHUR) << std::endl;
 | 
			
		||||
@@ -88,6 +88,7 @@ Application::Application(const std::string parameterFileName)
 | 
			
		||||
void Application::setPar(const Application::GlobalPar &par)
 | 
			
		||||
{
 | 
			
		||||
    par_ = par;
 | 
			
		||||
    env().setSeed(strToVec<int>(par_.seed));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const Application::GlobalPar & Application::getPar(void)
 | 
			
		||||
@@ -98,26 +99,14 @@ const Application::GlobalPar & Application::getPar(void)
 | 
			
		||||
// execute /////////////////////////////////////////////////////////////////////
 | 
			
		||||
void Application::run(void)
 | 
			
		||||
{
 | 
			
		||||
    LOG(Message) << "====== HADRONS APPLICATION START ======" << std::endl;
 | 
			
		||||
    if (!parameterFileName_.empty() and (vm().getNModule() == 0))
 | 
			
		||||
    {
 | 
			
		||||
        parseParameterFile(parameterFileName_);
 | 
			
		||||
    }
 | 
			
		||||
    if (getPar().runId.empty())
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR(Definition, "run id is empty");
 | 
			
		||||
    }
 | 
			
		||||
    LOG(Message) << "RUN ID '" << getPar().runId << "'" << std::endl;
 | 
			
		||||
    vm().setRunId(getPar().runId);
 | 
			
		||||
    vm().printContent();
 | 
			
		||||
    env().printContent();
 | 
			
		||||
    schedule();
 | 
			
		||||
    printSchedule();
 | 
			
		||||
    if (!getPar().graphFile.empty())
 | 
			
		||||
    {
 | 
			
		||||
        makeFileDir(getPar().graphFile, env().getGrid());
 | 
			
		||||
        vm().dumpModuleGraph(getPar().graphFile);
 | 
			
		||||
    }
 | 
			
		||||
    configLoop();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -229,12 +218,11 @@ void Application::loadSchedule(const std::string filename)
 | 
			
		||||
        program_.push_back(vm().getModuleAddress(name));
 | 
			
		||||
    }
 | 
			
		||||
    loadedSchedule_ = true;
 | 
			
		||||
    scheduled_      = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Application::printSchedule(void)
 | 
			
		||||
{
 | 
			
		||||
    if (!scheduled_ and !loadedSchedule_)
 | 
			
		||||
    if (!scheduled_)
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR(Definition, "Computation not scheduled");
 | 
			
		||||
    }
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Application.hpp
 | 
			
		||||
Source file: extras/Hadrons/Application.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
#ifndef Hadrons_Application_hpp_
 | 
			
		||||
#define Hadrons_Application_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/VirtualMachine.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/VirtualMachine.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
@@ -55,8 +55,7 @@ public:
 | 
			
		||||
        GRID_SERIALIZABLE_CLASS_MEMBERS(GlobalPar,
 | 
			
		||||
                                        TrajRange,                  trajCounter,
 | 
			
		||||
                                        VirtualMachine::GeneticPar, genetic,
 | 
			
		||||
                                        std::string,                runId,
 | 
			
		||||
                                        std::string,                graphFile);
 | 
			
		||||
                                        std::string,                seed);
 | 
			
		||||
    };
 | 
			
		||||
public:
 | 
			
		||||
    // constructors
 | 
			
		||||
							
								
								
									
										323
									
								
								extras/Hadrons/EigenPack.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										323
									
								
								extras/Hadrons/EigenPack.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,323 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: extras/Hadrons/EigenPack.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_EigenPack_hpp_
 | 
			
		||||
#define Hadrons_EigenPack_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/algorithms/iterative/Deflation.h>
 | 
			
		||||
#include <Grid/algorithms/iterative/LocalCoherenceLanczos.h>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
// Lanczos type
 | 
			
		||||
#ifndef HADRONS_DEFAULT_LANCZOS_NBASIS
 | 
			
		||||
#define HADRONS_DEFAULT_LANCZOS_NBASIS 60
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template <typename F>
 | 
			
		||||
class EigenPack
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef F Field;
 | 
			
		||||
    struct PackRecord
 | 
			
		||||
    {
 | 
			
		||||
        std::string operatorXml, solverXml;
 | 
			
		||||
    };
 | 
			
		||||
    struct VecRecord: Serializable
 | 
			
		||||
    {
 | 
			
		||||
        GRID_SERIALIZABLE_CLASS_MEMBERS(VecRecord,
 | 
			
		||||
                                        unsigned int, index,
 | 
			
		||||
                                        double,       eval);
 | 
			
		||||
        VecRecord(void): index(0), eval(0.) {}
 | 
			
		||||
    };
 | 
			
		||||
public:
 | 
			
		||||
    std::vector<RealD> eval;
 | 
			
		||||
    std::vector<F>     evec;
 | 
			
		||||
    PackRecord         record;
 | 
			
		||||
public:
 | 
			
		||||
    EigenPack(void)          = default;
 | 
			
		||||
    virtual ~EigenPack(void) = default;
 | 
			
		||||
 | 
			
		||||
    EigenPack(const size_t size, GridBase *grid)
 | 
			
		||||
    {
 | 
			
		||||
        resize(size, grid);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void resize(const size_t size, GridBase *grid)
 | 
			
		||||
    {
 | 
			
		||||
        eval.resize(size);
 | 
			
		||||
        evec.resize(size, grid);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void read(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        if (multiFile)
 | 
			
		||||
        {
 | 
			
		||||
            for(int k = 0; k < evec.size(); ++k)
 | 
			
		||||
            {
 | 
			
		||||
                basicReadSingle(evec[k], eval[k], evecFilename(fileStem, k, traj), k);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            basicRead(evec, eval, evecFilename(fileStem, -1, traj), evec.size());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void write(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        if (multiFile)
 | 
			
		||||
        {
 | 
			
		||||
            for(int k = 0; k < evec.size(); ++k)
 | 
			
		||||
            {
 | 
			
		||||
                basicWriteSingle(evecFilename(fileStem, k, traj), evec[k], eval[k], k);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            basicWrite(evecFilename(fileStem, -1, traj), evec, eval, evec.size());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
protected:
 | 
			
		||||
    std::string evecFilename(const std::string stem, const int vec, const int traj)
 | 
			
		||||
    {
 | 
			
		||||
        std::string t = (traj < 0) ? "" : ("." + std::to_string(traj));
 | 
			
		||||
 | 
			
		||||
        if (vec == -1)
 | 
			
		||||
        {
 | 
			
		||||
            return stem + t + ".bin";
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            return stem + t + "/v" + std::to_string(vec) + ".bin";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    void basicRead(std::vector<T> &evec, std::vector<double> &eval,
 | 
			
		||||
                   const std::string filename, const unsigned int size)
 | 
			
		||||
    {
 | 
			
		||||
        ScidacReader    binReader;
 | 
			
		||||
 | 
			
		||||
        binReader.open(filename);
 | 
			
		||||
        binReader.skipPastObjectRecord(SCIDAC_FILE_XML);
 | 
			
		||||
        for(int k = 0; k < size; ++k) 
 | 
			
		||||
        {
 | 
			
		||||
            VecRecord vecRecord;
 | 
			
		||||
 | 
			
		||||
            LOG(Message) << "Reading eigenvector " << k << std::endl;
 | 
			
		||||
            binReader.readScidacFieldRecord(evec[k], vecRecord);
 | 
			
		||||
            if (vecRecord.index != k)
 | 
			
		||||
            {
 | 
			
		||||
                HADRONS_ERROR(Io, "Eigenvector " + std::to_string(k) + " has a"
 | 
			
		||||
                              + " wrong index (expected " + std::to_string(vecRecord.index) 
 | 
			
		||||
                              + ") in file '" + filename + "'");
 | 
			
		||||
            }
 | 
			
		||||
            eval[k] = vecRecord.eval;
 | 
			
		||||
        }
 | 
			
		||||
        binReader.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    void basicReadSingle(T &evec, double &eval, const std::string filename, 
 | 
			
		||||
                         const unsigned int index)
 | 
			
		||||
    {
 | 
			
		||||
        ScidacReader binReader;
 | 
			
		||||
        VecRecord    vecRecord;
 | 
			
		||||
 | 
			
		||||
        binReader.open(filename);
 | 
			
		||||
        binReader.skipPastObjectRecord(SCIDAC_FILE_XML);
 | 
			
		||||
        LOG(Message) << "Reading eigenvector " << index << std::endl;
 | 
			
		||||
        binReader.readScidacFieldRecord(evec, vecRecord);
 | 
			
		||||
        if (vecRecord.index != index)
 | 
			
		||||
        {
 | 
			
		||||
            HADRONS_ERROR(Io, "Eigenvector " + std::to_string(index) + " has a"
 | 
			
		||||
                          + " wrong index (expected " + std::to_string(vecRecord.index) 
 | 
			
		||||
                          + ") in file '" + filename + "'");
 | 
			
		||||
        }
 | 
			
		||||
        eval = vecRecord.eval;
 | 
			
		||||
        binReader.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    void basicWrite(const std::string filename, std::vector<T> &evec, 
 | 
			
		||||
                    const std::vector<double> &eval, const unsigned int size)
 | 
			
		||||
    {
 | 
			
		||||
        ScidacWriter binWriter(evec[0]._grid->IsBoss());
 | 
			
		||||
        XmlWriter    xmlWriter("", "eigenPackPar");
 | 
			
		||||
 | 
			
		||||
        makeFileDir(filename, evec[0]._grid);
 | 
			
		||||
        xmlWriter.pushXmlString(record.operatorXml);
 | 
			
		||||
        xmlWriter.pushXmlString(record.solverXml);
 | 
			
		||||
        binWriter.open(filename);
 | 
			
		||||
        binWriter.writeLimeObject(1, 1, xmlWriter, "parameters", SCIDAC_FILE_XML);
 | 
			
		||||
        for(int k = 0; k < size; ++k) 
 | 
			
		||||
        {
 | 
			
		||||
            VecRecord vecRecord;
 | 
			
		||||
 | 
			
		||||
            vecRecord.index = k;
 | 
			
		||||
            vecRecord.eval  = eval[k];
 | 
			
		||||
            LOG(Message) << "Writing eigenvector " << k << std::endl;
 | 
			
		||||
            binWriter.writeScidacFieldRecord(evec[k], vecRecord, DEFAULT_ASCII_PREC);
 | 
			
		||||
        }
 | 
			
		||||
        binWriter.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    void basicWriteSingle(const std::string filename, T &evec, 
 | 
			
		||||
                          const double eval, const unsigned int index)
 | 
			
		||||
    {
 | 
			
		||||
        ScidacWriter binWriter(evec._grid->IsBoss());
 | 
			
		||||
        XmlWriter    xmlWriter("", "eigenPackPar");
 | 
			
		||||
        VecRecord    vecRecord;
 | 
			
		||||
 | 
			
		||||
        makeFileDir(filename, evec._grid);
 | 
			
		||||
        xmlWriter.pushXmlString(record.operatorXml);
 | 
			
		||||
        xmlWriter.pushXmlString(record.solverXml);
 | 
			
		||||
        binWriter.open(filename);
 | 
			
		||||
        binWriter.writeLimeObject(1, 1, xmlWriter, "parameters", SCIDAC_FILE_XML);
 | 
			
		||||
        vecRecord.index = index;
 | 
			
		||||
        vecRecord.eval  = eval;
 | 
			
		||||
        LOG(Message) << "Writing eigenvector " << index << std::endl;
 | 
			
		||||
        binWriter.writeScidacFieldRecord(evec, vecRecord, DEFAULT_ASCII_PREC);
 | 
			
		||||
        binWriter.close();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FineF, typename CoarseF>
 | 
			
		||||
class CoarseEigenPack: public EigenPack<FineF>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef CoarseF CoarseField;
 | 
			
		||||
public:
 | 
			
		||||
    std::vector<RealD>   evalCoarse;
 | 
			
		||||
    std::vector<CoarseF> evecCoarse;
 | 
			
		||||
public:
 | 
			
		||||
    CoarseEigenPack(void)          = default;
 | 
			
		||||
    virtual ~CoarseEigenPack(void) = default;
 | 
			
		||||
 | 
			
		||||
    CoarseEigenPack(const size_t sizeFine, const size_t sizeCoarse, 
 | 
			
		||||
                    GridBase *gridFine, GridBase *gridCoarse)
 | 
			
		||||
    {
 | 
			
		||||
        resize(sizeFine, sizeCoarse, gridFine, gridCoarse);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void resize(const size_t sizeFine, const size_t sizeCoarse, 
 | 
			
		||||
                GridBase *gridFine, GridBase *gridCoarse)
 | 
			
		||||
    {
 | 
			
		||||
        EigenPack<FineF>::resize(sizeFine, gridFine);
 | 
			
		||||
        evalCoarse.resize(sizeCoarse);
 | 
			
		||||
        evecCoarse.resize(sizeCoarse, gridCoarse);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void readFine(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        if (multiFile)
 | 
			
		||||
        {
 | 
			
		||||
            for(int k = 0; k < this->evec.size(); ++k)
 | 
			
		||||
            {
 | 
			
		||||
                this->basicReadSingle(this->evec[k], this->eval[k], this->evecFilename(fileStem + "_fine", k, traj), k);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            this->basicRead(this->evec, this->eval, this->evecFilename(fileStem + "_fine", -1, traj), this->evec.size());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void readCoarse(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        if (multiFile)
 | 
			
		||||
        {
 | 
			
		||||
            for(int k = 0; k < evecCoarse.size(); ++k)
 | 
			
		||||
            {
 | 
			
		||||
                this->basicReadSingle(evecCoarse[k], evalCoarse[k], this->evecFilename(fileStem + "_coarse", k, traj), k);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            this->basicRead(evecCoarse, evalCoarse, this->evecFilename(fileStem + "_coarse", -1, traj), evecCoarse.size());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void read(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        readFine(fileStem, multiFile, traj);
 | 
			
		||||
        readCoarse(fileStem, multiFile, traj);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void writeFine(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        if (multiFile)
 | 
			
		||||
        {
 | 
			
		||||
            for(int k = 0; k < this->evec.size(); ++k)
 | 
			
		||||
            {
 | 
			
		||||
                this->basicWriteSingle(this->evecFilename(fileStem + "_fine", k, traj), this->evec[k], this->eval[k], k);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            this->basicWrite(this->evecFilename(fileStem + "_fine", -1, traj), this->evec, this->eval, this->evec.size());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void writeCoarse(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        if (multiFile)
 | 
			
		||||
        {
 | 
			
		||||
            for(int k = 0; k < evecCoarse.size(); ++k)
 | 
			
		||||
            {
 | 
			
		||||
                this->basicWriteSingle(this->evecFilename(fileStem + "_coarse", k, traj), evecCoarse[k], evalCoarse[k], k);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            this->basicWrite(this->evecFilename(fileStem + "_coarse", -1, traj), evecCoarse, evalCoarse, evecCoarse.size());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    virtual void write(const std::string fileStem, const bool multiFile, const int traj = -1)
 | 
			
		||||
    {
 | 
			
		||||
        writeFine(fileStem, multiFile, traj);
 | 
			
		||||
        writeCoarse(fileStem, multiFile, traj);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
using FermionEigenPack = EigenPack<typename FImpl::FermionField>;
 | 
			
		||||
 | 
			
		||||
template <typename FImpl, int nBasis>
 | 
			
		||||
using CoarseFermionEigenPack = CoarseEigenPack<
 | 
			
		||||
    typename FImpl::FermionField,
 | 
			
		||||
    typename LocalCoherenceLanczos<typename FImpl::SiteSpinor, 
 | 
			
		||||
                                   typename FImpl::SiteComplex, 
 | 
			
		||||
                                   nBasis>::CoarseField>;
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_EigenPack_hpp_
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Environment.cc
 | 
			
		||||
Source file: extras/Hadrons/Environment.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -26,16 +26,16 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Environment.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Environment.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace QCD;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
 | 
			
		||||
#define ERROR_NO_ADDRESS(address)\
 | 
			
		||||
HADRONS_ERROR_REF(ObjectDefinition, "no object with address " + std::to_string(address), address);
 | 
			
		||||
HADRONS_ERROR(Definition, "no object with address " + std::to_string(address));
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                       Environment implementation                           *
 | 
			
		||||
@@ -45,16 +45,135 @@ Environment::Environment(void)
 | 
			
		||||
{
 | 
			
		||||
    dim_ = GridDefaultLatt();
 | 
			
		||||
    nd_  = dim_.size();
 | 
			
		||||
    createGrid<vComplex>(1);
 | 
			
		||||
    grid4d_.reset(SpaceTimeGrid::makeFourDimGrid(
 | 
			
		||||
        dim_, GridDefaultSimd(nd_, vComplex::Nsimd()),
 | 
			
		||||
        GridDefaultMpi()));
 | 
			
		||||
    gridRb4d_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(grid4d_.get()));
 | 
			
		||||
    vol_ = 1.;
 | 
			
		||||
    for (auto d: dim_)
 | 
			
		||||
    {
 | 
			
		||||
        vol_ *= d;
 | 
			
		||||
    }
 | 
			
		||||
    rng4d_.reset(new GridParallelRNG(getGrid()));
 | 
			
		||||
    rng4d_.reset(new GridParallelRNG(grid4d_.get()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// grids ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
void Environment::createGrid(const unsigned int Ls)
 | 
			
		||||
{
 | 
			
		||||
    if ((Ls > 1) and (grid5d_.find(Ls) == grid5d_.end()))
 | 
			
		||||
    {
 | 
			
		||||
        auto g = getGrid();
 | 
			
		||||
        
 | 
			
		||||
        grid5d_[Ls].reset(SpaceTimeGrid::makeFiveDimGrid(Ls, g));
 | 
			
		||||
        gridRb5d_[Ls].reset(SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls, g));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Environment::createCoarseGrid(const std::vector<int> &blockSize, 
 | 
			
		||||
                                   const unsigned int Ls)
 | 
			
		||||
{
 | 
			
		||||
    int              nd      = getNd();
 | 
			
		||||
    std::vector<int> fineDim = getDim(), coarseDim;
 | 
			
		||||
    unsigned int     cLs;
 | 
			
		||||
    auto             key4d = blockSize, key5d = blockSize;
 | 
			
		||||
 | 
			
		||||
    createGrid(Ls);
 | 
			
		||||
    coarseDim.resize(nd);
 | 
			
		||||
    for (int d = 0; d < coarseDim.size(); d++)
 | 
			
		||||
    {
 | 
			
		||||
        coarseDim[d] = fineDim[d]/blockSize[d];
 | 
			
		||||
        if (coarseDim[d]*blockSize[d] != fineDim[d])
 | 
			
		||||
        {
 | 
			
		||||
            HADRONS_ERROR(Size, "Fine dimension " + std::to_string(d) 
 | 
			
		||||
                         + " (" + std::to_string(fineDim[d]) 
 | 
			
		||||
                         + ") not divisible by coarse dimension ("
 | 
			
		||||
                         + std::to_string(coarseDim[d]) + ")"); 
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (blockSize.size() > nd)
 | 
			
		||||
    {
 | 
			
		||||
        cLs = Ls/blockSize[nd];
 | 
			
		||||
        if (cLs*blockSize[nd] != Ls)
 | 
			
		||||
        {
 | 
			
		||||
            HADRONS_ERROR(Size, "Fine Ls (" + std::to_string(Ls) 
 | 
			
		||||
                         + ") not divisible by coarse Ls ("
 | 
			
		||||
                         + std::to_string(cLs) + ")");
 | 
			
		||||
        }
 | 
			
		||||
        key4d.resize(nd);
 | 
			
		||||
        key5d.push_back(Ls);
 | 
			
		||||
    }
 | 
			
		||||
    gridCoarse4d_[key4d].reset(
 | 
			
		||||
        SpaceTimeGrid::makeFourDimGrid(coarseDim, 
 | 
			
		||||
            GridDefaultSimd(nd, vComplex::Nsimd()), GridDefaultMpi()));
 | 
			
		||||
    if (Ls > 1)
 | 
			
		||||
    {
 | 
			
		||||
        gridCoarse5d_[key5d].reset(
 | 
			
		||||
            SpaceTimeGrid::makeFiveDimGrid(cLs, gridCoarse4d_[key4d].get()));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 &)
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR(Definition, "no grid with Ls= " + std::to_string(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 &)
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR(Definition, "no red-black grid with Ls= " + std::to_string(Ls));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GridCartesian * Environment::getCoarseGrid(
 | 
			
		||||
    const std::vector<int> &blockSize, const unsigned int Ls) const
 | 
			
		||||
{
 | 
			
		||||
    auto key = blockSize;
 | 
			
		||||
 | 
			
		||||
    try
 | 
			
		||||
    {
 | 
			
		||||
        if (Ls == 1)
 | 
			
		||||
        {
 | 
			
		||||
            key.resize(getNd());
 | 
			
		||||
            return gridCoarse4d_.at(key).get();
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            key.push_back(Ls);
 | 
			
		||||
            return gridCoarse5d_.at(key).get();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    catch(std::out_of_range &)
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR(Definition, "no coarse grid with Ls= " + std::to_string(Ls));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned int Environment::getNd(void) const
 | 
			
		||||
{
 | 
			
		||||
    return nd_;
 | 
			
		||||
@@ -76,6 +195,11 @@ double Environment::getVolume(void) const
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// random number generator /////////////////////////////////////////////////////
 | 
			
		||||
void Environment::setSeed(const std::vector<int> &seed)
 | 
			
		||||
{
 | 
			
		||||
    rng4d_->SeedFixedIntegers(seed);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GridParallelRNG * Environment::get4dRng(void) const
 | 
			
		||||
{
 | 
			
		||||
    return rng4d_.get();
 | 
			
		||||
@@ -96,8 +220,7 @@ void Environment::addObject(const std::string name, const int moduleAddress)
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR_REF(ObjectDefinition, "object '" + name + "' already exists",
 | 
			
		||||
                          getObjectAddress(name));
 | 
			
		||||
        HADRONS_ERROR(Definition, "object '" + name + "' already exists");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Environment.hpp
 | 
			
		||||
Source file: extras/Hadrons/Environment.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -29,7 +29,7 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
#ifndef Hadrons_Environment_hpp_
 | 
			
		||||
#define Hadrons_Environment_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
@@ -63,9 +63,6 @@ inline Environment & env(void) const\
 | 
			
		||||
    return Environment::getInstance();\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define DEFINE_ENV_LAMBDA \
 | 
			
		||||
auto env = [](void)->Environment &{return Environment::getInstance();}
 | 
			
		||||
 | 
			
		||||
class Environment
 | 
			
		||||
{
 | 
			
		||||
    SINGLETON(Environment);
 | 
			
		||||
@@ -86,33 +83,21 @@ private:
 | 
			
		||||
        int                     module{-1};
 | 
			
		||||
        std::unique_ptr<Object> data{nullptr};
 | 
			
		||||
    };
 | 
			
		||||
    typedef std::pair<size_t, unsigned int>     FineGridKey;
 | 
			
		||||
    typedef std::pair<size_t, std::vector<int>> CoarseGridKey;
 | 
			
		||||
public:
 | 
			
		||||
    // grids
 | 
			
		||||
    template <typename VType = vComplex>
 | 
			
		||||
    void                    createGrid(const unsigned int Ls);
 | 
			
		||||
    template <typename VType = vComplex>
 | 
			
		||||
    void                    createCoarseGrid(const std::vector<int> &blockSize,
 | 
			
		||||
                                             const unsigned int Ls);
 | 
			
		||||
    template <typename VType = vComplex>
 | 
			
		||||
    GridCartesian *         getGrid(void);
 | 
			
		||||
    template <typename VType = vComplex>
 | 
			
		||||
    GridRedBlackCartesian * getRbGrid(void);
 | 
			
		||||
    template <typename VType = vComplex>
 | 
			
		||||
    GridCartesian *         getCoarseGrid(const std::vector<int> &blockSize);
 | 
			
		||||
    template <typename VType = vComplex>
 | 
			
		||||
    GridCartesian *         getGrid(const unsigned int Ls);
 | 
			
		||||
    template <typename VType = vComplex>
 | 
			
		||||
    GridRedBlackCartesian * getRbGrid(const unsigned int Ls);
 | 
			
		||||
    template <typename VType = vComplex>
 | 
			
		||||
                                             const unsigned int Ls = 1);
 | 
			
		||||
    GridCartesian *         getGrid(const unsigned int Ls = 1) const;
 | 
			
		||||
    GridRedBlackCartesian * getRbGrid(const unsigned int Ls = 1) const;
 | 
			
		||||
    GridCartesian *         getCoarseGrid(const std::vector<int> &blockSize,
 | 
			
		||||
                                          const unsigned int Ls);
 | 
			
		||||
                                          const unsigned int Ls = 1) const;
 | 
			
		||||
    std::vector<int>        getDim(void) const;
 | 
			
		||||
    int                     getDim(const unsigned int mu) const;
 | 
			
		||||
    unsigned int            getNd(void) const;
 | 
			
		||||
    double                  getVolume(void) const;
 | 
			
		||||
    // random number generator
 | 
			
		||||
    void                    setSeed(const std::vector<int> &seed);
 | 
			
		||||
    GridParallelRNG *       get4dRng(void) const;
 | 
			
		||||
    // general memory management
 | 
			
		||||
    void                    addObject(const std::string name,
 | 
			
		||||
@@ -174,12 +159,12 @@ private:
 | 
			
		||||
    bool                                   protect_{true};
 | 
			
		||||
    // grids
 | 
			
		||||
    std::vector<int>                       dim_;
 | 
			
		||||
    std::map<FineGridKey, GridPt>       grid4d_;
 | 
			
		||||
    std::map<FineGridKey, GridPt>       grid5d_;
 | 
			
		||||
    std::map<FineGridKey, GridRbPt>     gridRb4d_;
 | 
			
		||||
    std::map<FineGridKey, GridRbPt>     gridRb5d_;
 | 
			
		||||
    std::map<CoarseGridKey, GridPt>     gridCoarse4d_;
 | 
			
		||||
    std::map<CoarseGridKey, GridPt>     gridCoarse5d_;
 | 
			
		||||
    GridPt                                 grid4d_;
 | 
			
		||||
    std::map<unsigned int, GridPt>         grid5d_;
 | 
			
		||||
    GridRbPt                               gridRb4d_;
 | 
			
		||||
    std::map<unsigned int, GridRbPt>       gridRb5d_;
 | 
			
		||||
    std::map<std::vector<int>, GridPt>     gridCoarse4d_;
 | 
			
		||||
    std::map<std::vector<int>, GridPt>     gridCoarse5d_;
 | 
			
		||||
    unsigned int                           nd_;
 | 
			
		||||
    // random number generator
 | 
			
		||||
    RngPt                                  rng4d_;
 | 
			
		||||
@@ -219,219 +204,6 @@ void Holder<T>::reset(T *pt)
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                     Environment template implementation                    *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// grids ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
#define HADRONS_DUMP_GRID(...)\
 | 
			
		||||
LOG(Debug) << "New grid " << (__VA_ARGS__) << std::endl;\
 | 
			
		||||
LOG(Debug) << " - cb  : " << (__VA_ARGS__)->_isCheckerBoarded << std::endl;\
 | 
			
		||||
LOG(Debug) << " - fdim: " << (__VA_ARGS__)->_fdimensions << std::endl;\
 | 
			
		||||
LOG(Debug) << " - gdim: " << (__VA_ARGS__)->_gdimensions << std::endl;\
 | 
			
		||||
LOG(Debug) << " - ldim: " << (__VA_ARGS__)->_ldimensions << std::endl;\
 | 
			
		||||
LOG(Debug) << " - rdim: " << (__VA_ARGS__)->_rdimensions << std::endl;
 | 
			
		||||
 | 
			
		||||
template <typename VType>
 | 
			
		||||
void Environment::createGrid(const unsigned int Ls)
 | 
			
		||||
{
 | 
			
		||||
    size_t hash = typeHash<VType>();
 | 
			
		||||
 | 
			
		||||
    if (grid4d_.find({hash, 1}) == grid4d_.end())
 | 
			
		||||
    {
 | 
			
		||||
        grid4d_[{hash, 1}].reset(
 | 
			
		||||
            SpaceTimeGrid::makeFourDimGrid(getDim(), 
 | 
			
		||||
                                        GridDefaultSimd(getNd(), VType::Nsimd()),
 | 
			
		||||
                                        GridDefaultMpi()));
 | 
			
		||||
        HADRONS_DUMP_GRID(grid4d_[{hash, 1}].get());
 | 
			
		||||
        gridRb4d_[{hash, 1}].reset(
 | 
			
		||||
            SpaceTimeGrid::makeFourDimRedBlackGrid(grid4d_[{hash, 1}].get()));
 | 
			
		||||
        HADRONS_DUMP_GRID(gridRb4d_[{hash, 1}].get());
 | 
			
		||||
    }
 | 
			
		||||
    if (grid5d_.find({hash, Ls}) == grid5d_.end())
 | 
			
		||||
    {
 | 
			
		||||
        auto g = grid4d_[{hash, 1}].get();
 | 
			
		||||
        
 | 
			
		||||
        grid5d_[{hash, Ls}].reset(SpaceTimeGrid::makeFiveDimGrid(Ls, g));
 | 
			
		||||
        HADRONS_DUMP_GRID(grid5d_[{hash, Ls}].get());
 | 
			
		||||
        gridRb5d_[{hash, Ls}].reset(SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls, g));
 | 
			
		||||
        HADRONS_DUMP_GRID(gridRb5d_[{hash, Ls}].get());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename VType>
 | 
			
		||||
void Environment::createCoarseGrid(const std::vector<int> &blockSize,
 | 
			
		||||
                                   const unsigned int Ls)
 | 
			
		||||
{
 | 
			
		||||
    int              nd      = getNd();
 | 
			
		||||
    std::vector<int> fineDim = getDim(), coarseDim(nd);
 | 
			
		||||
    unsigned int     cLs;
 | 
			
		||||
    auto             key4d = blockSize, key5d = blockSize;
 | 
			
		||||
    size_t           hash  = typeHash<VType>();
 | 
			
		||||
 | 
			
		||||
    createGrid(Ls);
 | 
			
		||||
    for (int d = 0; d < coarseDim.size(); d++)
 | 
			
		||||
    {
 | 
			
		||||
        coarseDim[d] = fineDim[d]/blockSize[d];
 | 
			
		||||
        if (coarseDim[d]*blockSize[d] != fineDim[d])
 | 
			
		||||
        {
 | 
			
		||||
            HADRONS_ERROR(Size, "Fine dimension " + std::to_string(d) 
 | 
			
		||||
                         + " (" + std::to_string(fineDim[d]) 
 | 
			
		||||
                         + ") not divisible by coarse dimension ("
 | 
			
		||||
                         + std::to_string(coarseDim[d]) + ")"); 
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (blockSize.size() > nd)
 | 
			
		||||
    {
 | 
			
		||||
        cLs = Ls/blockSize[nd];
 | 
			
		||||
        if (cLs*blockSize[nd] != Ls)
 | 
			
		||||
        {
 | 
			
		||||
            HADRONS_ERROR(Size, "Fine Ls (" + std::to_string(Ls) 
 | 
			
		||||
                         + ") not divisible by coarse Ls ("
 | 
			
		||||
                         + std::to_string(cLs) + ")");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        cLs = Ls;
 | 
			
		||||
    }
 | 
			
		||||
    key4d.resize(nd);
 | 
			
		||||
    key5d.push_back(Ls);
 | 
			
		||||
 | 
			
		||||
    CoarseGridKey hkey4d = {hash, key4d}, hkey5d = {hash, key5d};
 | 
			
		||||
 | 
			
		||||
    if (gridCoarse4d_.find(hkey4d) == gridCoarse4d_.end())
 | 
			
		||||
    {
 | 
			
		||||
        gridCoarse4d_[hkey4d].reset(
 | 
			
		||||
            SpaceTimeGrid::makeFourDimGrid(coarseDim, 
 | 
			
		||||
                GridDefaultSimd(nd, VType::Nsimd()), GridDefaultMpi()));
 | 
			
		||||
        HADRONS_DUMP_GRID(gridCoarse4d_[hkey4d].get());
 | 
			
		||||
    }
 | 
			
		||||
    if (gridCoarse5d_.find(hkey5d) == gridCoarse5d_.end())
 | 
			
		||||
    {
 | 
			
		||||
        gridCoarse5d_[hkey5d].reset(
 | 
			
		||||
            SpaceTimeGrid::makeFiveDimGrid(cLs, gridCoarse4d_[hkey4d].get()));
 | 
			
		||||
        HADRONS_DUMP_GRID(gridCoarse5d_[hkey5d].get());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef HADRONS_DUMP_GRID
 | 
			
		||||
 | 
			
		||||
template <typename VType>
 | 
			
		||||
GridCartesian * Environment::getGrid(void)
 | 
			
		||||
{
 | 
			
		||||
    FineGridKey key = {typeHash<VType>(), 1};
 | 
			
		||||
 | 
			
		||||
    auto it = grid4d_.find(key);
 | 
			
		||||
 | 
			
		||||
    if (it != grid4d_.end())
 | 
			
		||||
    {
 | 
			
		||||
        return it->second.get();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        createGrid<VType>(1);
 | 
			
		||||
 | 
			
		||||
        return grid4d_.at(key).get();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename VType>
 | 
			
		||||
GridRedBlackCartesian * Environment::getRbGrid(void)
 | 
			
		||||
{
 | 
			
		||||
    FineGridKey key = {typeHash<VType>(), 1};
 | 
			
		||||
    auto        it  = gridRb4d_.find(key);
 | 
			
		||||
 | 
			
		||||
    if (it != gridRb4d_.end())
 | 
			
		||||
    {
 | 
			
		||||
        return it->second.get();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        createGrid<VType>(1);
 | 
			
		||||
 | 
			
		||||
        return gridRb4d_.at(key).get();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename VType>
 | 
			
		||||
GridCartesian * Environment::getCoarseGrid(const std::vector<int> &blockSize)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<int> s = blockSize;
 | 
			
		||||
 | 
			
		||||
    s.resize(getNd());
 | 
			
		||||
 | 
			
		||||
    CoarseGridKey key = {typeHash<VType>(), s};
 | 
			
		||||
    auto          it  = gridCoarse4d_.find(key);
 | 
			
		||||
 | 
			
		||||
    if (it != gridCoarse4d_.end())
 | 
			
		||||
    {
 | 
			
		||||
        return it->second.get();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        createCoarseGrid<VType>(blockSize, 1);
 | 
			
		||||
        
 | 
			
		||||
        return gridCoarse4d_.at(key).get();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename VType>
 | 
			
		||||
GridCartesian * Environment::getGrid(const unsigned int Ls)
 | 
			
		||||
{
 | 
			
		||||
    FineGridKey key = {typeHash<VType>(), Ls};
 | 
			
		||||
    auto        it  = grid5d_.find(key);
 | 
			
		||||
 | 
			
		||||
    if (it != grid5d_.end())
 | 
			
		||||
    {
 | 
			
		||||
        return it->second.get();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        createGrid<VType>(Ls);
 | 
			
		||||
 | 
			
		||||
        return grid5d_.at(key).get();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename VType>
 | 
			
		||||
GridRedBlackCartesian * Environment::getRbGrid(const unsigned int Ls)
 | 
			
		||||
{
 | 
			
		||||
    FineGridKey key = {typeHash<VType>(), Ls};
 | 
			
		||||
    auto        it  = gridRb5d_.find(key);
 | 
			
		||||
 | 
			
		||||
    if (it != gridRb5d_.end())
 | 
			
		||||
    {
 | 
			
		||||
        return it->second.get();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        createGrid<VType>(Ls);
 | 
			
		||||
 | 
			
		||||
        return gridRb5d_.at(key).get();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename VType>
 | 
			
		||||
GridCartesian * Environment::getCoarseGrid(const std::vector<int> &blockSize,
 | 
			
		||||
                                           const unsigned int Ls)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<int> s = blockSize;
 | 
			
		||||
 | 
			
		||||
    s.push_back(Ls);
 | 
			
		||||
 | 
			
		||||
    CoarseGridKey key = {typeHash<VType>(), s};
 | 
			
		||||
 | 
			
		||||
    auto it = gridCoarse5d_.find(key);
 | 
			
		||||
    if (it != gridCoarse5d_.end())
 | 
			
		||||
    {
 | 
			
		||||
        return it->second.get();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        createCoarseGrid<VType>(blockSize, Ls);
 | 
			
		||||
 | 
			
		||||
        return gridCoarse5d_.at(key).get();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// general memory management ///////////////////////////////////////////////////
 | 
			
		||||
template <typename B, typename T, typename ... Ts>
 | 
			
		||||
void Environment::createDerivedObject(const std::string name,
 | 
			
		||||
@@ -459,8 +231,8 @@ void Environment::createDerivedObject(const std::string name,
 | 
			
		||||
        object_[address].Ls          = Ls;
 | 
			
		||||
        object_[address].data.reset(new Holder<B>(new T(std::forward<Ts>(args)...)));
 | 
			
		||||
        object_[address].size        = MemoryProfiler::stats->maxAllocated - initMem;
 | 
			
		||||
        object_[address].type        = typeIdPt<B>();
 | 
			
		||||
        object_[address].derivedType = typeIdPt<T>();
 | 
			
		||||
        object_[address].type        = &typeid(B);
 | 
			
		||||
        object_[address].derivedType = &typeid(T);
 | 
			
		||||
        if (MemoryProfiler::stats == &memStats)
 | 
			
		||||
        {
 | 
			
		||||
            MemoryProfiler::stats = nullptr;
 | 
			
		||||
@@ -470,10 +242,10 @@ void Environment::createDerivedObject(const std::string name,
 | 
			
		||||
    else if ((object_[address].storage     != Storage::cache) or 
 | 
			
		||||
             (object_[address].storage     != storage)        or
 | 
			
		||||
             (object_[address].name        != name)           or
 | 
			
		||||
             (typeHash(object_[address].type)        != typeHash<B>())  or
 | 
			
		||||
             (typeHash(object_[address].derivedType) != typeHash<T>()))
 | 
			
		||||
             (object_[address].type        != &typeid(B))     or
 | 
			
		||||
             (object_[address].derivedType != &typeid(T)))
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR_REF(ObjectDefinition, "object '" + name + "' already allocated", address);
 | 
			
		||||
        HADRONS_ERROR(Definition, "object '" + name + "' already allocated");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -507,31 +279,28 @@ T * Environment::getDerivedObject(const unsigned int address) const
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        HADRONS_ERROR_REF(ObjectType, "object with address " +
 | 
			
		||||
                            std::to_string(address) +
 | 
			
		||||
                        HADRONS_ERROR(Definition, "object with address " + std::to_string(address) +
 | 
			
		||||
                            " cannot be casted to '" + typeName(&typeid(T)) +
 | 
			
		||||
                            "' (has type '" + typeName(&typeid(h->get())) + "')", address);
 | 
			
		||||
                            "' (has type '" + typeName(&typeid(h->get())) + "')");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                HADRONS_ERROR_REF(ObjectType, "object with address " + 
 | 
			
		||||
                            std::to_string(address) +
 | 
			
		||||
                HADRONS_ERROR(Definition, "object with address " + std::to_string(address) +
 | 
			
		||||
                            " does not have type '" + typeName(&typeid(B)) +
 | 
			
		||||
                            "' (has type '" + getObjectType(address) + "')", address);
 | 
			
		||||
                            "' (has type '" + getObjectType(address) + "')");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            HADRONS_ERROR_REF(ObjectDefinition, "object with address " + 
 | 
			
		||||
                              std::to_string(address) + " is empty", address);
 | 
			
		||||
            HADRONS_ERROR(Definition, "object with address " + std::to_string(address) +
 | 
			
		||||
                         " is empty");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR_REF(ObjectDefinition, "no object with address " + 
 | 
			
		||||
                          std::to_string(address), address);
 | 
			
		||||
        HADRONS_ERROR(Definition, "no object with address " + std::to_string(address));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -569,8 +338,7 @@ bool Environment::isObjectOfType(const unsigned int address) const
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        HADRONS_ERROR_REF(ObjectDefinition, "no object with address " 
 | 
			
		||||
                          + std::to_string(address), address);
 | 
			
		||||
        HADRONS_ERROR(Definition, "no object with address " + std::to_string(address));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Exceptions.cc
 | 
			
		||||
Source file: extras/Hadrons/Exceptions.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -26,50 +26,38 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Exceptions.hpp>
 | 
			
		||||
#include <Hadrons/VirtualMachine.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Exceptions.hpp>
 | 
			
		||||
#include <Grid/Hadrons/VirtualMachine.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
 | 
			
		||||
#ifndef ERR_SUFF
 | 
			
		||||
#define ERR_SUFF " (" + loc + ")"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define CTOR_EXC(name, init) \
 | 
			
		||||
#define CONST_EXC(name, init) \
 | 
			
		||||
name::name(std::string msg, std::string loc)\
 | 
			
		||||
:init\
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
#define CTOR_EXC_REF(name, init) \
 | 
			
		||||
name::name(std::string msg, std::string loc, const unsigned int address)\
 | 
			
		||||
:init\
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace Exceptions;
 | 
			
		||||
 | 
			
		||||
// backtrace cache
 | 
			
		||||
std::vector<std::string> Grid::Hadrons::Exceptions::backtraceStr;
 | 
			
		||||
 | 
			
		||||
// logic errors
 | 
			
		||||
CTOR_EXC(Logic, logic_error(msg + ERR_SUFF))
 | 
			
		||||
CTOR_EXC(Definition, Logic("definition error: " + msg, loc))
 | 
			
		||||
CTOR_EXC(Implementation, Logic("implementation error: " + msg, loc))
 | 
			
		||||
CTOR_EXC(Range, Logic("range error: " + msg, loc))
 | 
			
		||||
CTOR_EXC(Size, Logic("size error: " + msg, loc))
 | 
			
		||||
CONST_EXC(Logic, logic_error(msg + ERR_SUFF))
 | 
			
		||||
CONST_EXC(Definition, Logic("definition error: " + msg, loc))
 | 
			
		||||
CONST_EXC(Implementation, Logic("implementation error: " + msg, loc))
 | 
			
		||||
CONST_EXC(Range, Logic("range error: " + msg, loc))
 | 
			
		||||
CONST_EXC(Size, Logic("size error: " + msg, loc))
 | 
			
		||||
 | 
			
		||||
// runtime errors
 | 
			
		||||
CTOR_EXC(Runtime, runtime_error(msg + ERR_SUFF))
 | 
			
		||||
CTOR_EXC(Argument, Runtime("argument error: " + msg, loc))
 | 
			
		||||
CTOR_EXC(Io, Runtime("IO error: " + msg, loc))
 | 
			
		||||
CTOR_EXC(Memory, Runtime("memory error: " + msg, loc))
 | 
			
		||||
CTOR_EXC(Parsing, Runtime("parsing error: " + msg, loc))
 | 
			
		||||
CTOR_EXC(Program, Runtime("program error: " + msg, loc))
 | 
			
		||||
CTOR_EXC(System, Runtime("system error: " + msg, loc))
 | 
			
		||||
 | 
			
		||||
// virtual machine errors
 | 
			
		||||
CTOR_EXC_REF(ObjectDefinition, RuntimeRef("object definition error: " + msg, loc, address));
 | 
			
		||||
CTOR_EXC_REF(ObjectType, RuntimeRef("object type error: " + msg, loc, address));
 | 
			
		||||
CONST_EXC(Runtime, runtime_error(msg + ERR_SUFF))
 | 
			
		||||
CONST_EXC(Argument, Runtime("argument error: " + msg, loc))
 | 
			
		||||
CONST_EXC(Io, Runtime("IO error: " + msg, loc))
 | 
			
		||||
CONST_EXC(Memory, Runtime("memory error: " + msg, loc))
 | 
			
		||||
CONST_EXC(Parsing, Runtime("parsing error: " + msg, loc))
 | 
			
		||||
CONST_EXC(Program, Runtime("program error: " + msg, loc))
 | 
			
		||||
CONST_EXC(System, Runtime("system error: " + msg, loc))
 | 
			
		||||
 | 
			
		||||
// abort functions
 | 
			
		||||
void Grid::Hadrons::Exceptions::abort(const std::exception& e)
 | 
			
		||||
@@ -86,15 +74,6 @@ void Grid::Hadrons::Exceptions::abort(const std::exception& e)
 | 
			
		||||
                    << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    LOG(Error) << e.what() << std::endl;
 | 
			
		||||
    if (!backtraceStr.empty())
 | 
			
		||||
    {
 | 
			
		||||
        LOG(Error) << "-- BACKTRACE --------------" << std::endl;
 | 
			
		||||
        for (auto &s: backtraceStr)
 | 
			
		||||
        {
 | 
			
		||||
            LOG(Error) << s << std::endl;
 | 
			
		||||
        }
 | 
			
		||||
        LOG(Error) << "---------------------------" << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    LOG(Error) << "Aborting program" << std::endl;
 | 
			
		||||
    Grid_finalize();
 | 
			
		||||
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Exceptions.hpp
 | 
			
		||||
Source file: extras/Hadrons/Exceptions.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -30,41 +30,15 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
#define Hadrons_Exceptions_hpp_
 | 
			
		||||
 | 
			
		||||
#include <stdexcept>
 | 
			
		||||
#include <execinfo.h>
 | 
			
		||||
#ifndef Hadrons_Global_hpp_
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HADRONS_SRC_LOC std::string(__FUNCTION__) + " at " \
 | 
			
		||||
                        + std::string(__FILE__) + ":" + std::to_string(__LINE__)
 | 
			
		||||
#define HADRONS_BACKTRACE_MAX 128
 | 
			
		||||
#ifdef HAVE_EXECINFO_H
 | 
			
		||||
#define HADRONS_CACHE_BACKTRACE \
 | 
			
		||||
{\
 | 
			
		||||
    void* _callstack[HADRONS_BACKTRACE_MAX];\
 | 
			
		||||
    int _i, _frames = backtrace(_callstack, HADRONS_BACKTRACE_MAX);\
 | 
			
		||||
    char** _strs = backtrace_symbols(_callstack, _frames);\
 | 
			
		||||
    Grid::Hadrons::Exceptions::backtraceStr.clear();\
 | 
			
		||||
    for (_i = 0; _i < _frames; ++_i)\
 | 
			
		||||
    {\
 | 
			
		||||
        Hadrons::Exceptions::backtraceStr.push_back(std::string(_strs[_i]));\
 | 
			
		||||
    }\
 | 
			
		||||
    free(_strs);\
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
#define HADRONS_CACHE_BACKTRACE \
 | 
			
		||||
Grid::Hadrons::Exceptions::backtraceStr.clear();\
 | 
			
		||||
Grid::Hadrons::Exceptions::backtraceStr.push_back("<backtrace not supported>");
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HADRONS_ERROR(exc, msg)\
 | 
			
		||||
HADRONS_CACHE_BACKTRACE \
 | 
			
		||||
throw(Exceptions::exc(msg, HADRONS_SRC_LOC));
 | 
			
		||||
 | 
			
		||||
#define HADRONS_ERROR_REF(exc, msg, address)\
 | 
			
		||||
HADRONS_CACHE_BACKTRACE \
 | 
			
		||||
throw(Exceptions::exc(msg, HADRONS_SRC_LOC, address));
 | 
			
		||||
 | 
			
		||||
#define DECL_EXC(name, base) \
 | 
			
		||||
class name: public base\
 | 
			
		||||
{\
 | 
			
		||||
@@ -72,20 +46,10 @@ public:\
 | 
			
		||||
    name(std::string msg, std::string loc);\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define DECL_EXC_REF(name, base) \
 | 
			
		||||
class name: public base\
 | 
			
		||||
{\
 | 
			
		||||
public:\
 | 
			
		||||
    name(std::string msg, std::string loc, const unsigned int address);\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
namespace Exceptions
 | 
			
		||||
{
 | 
			
		||||
    // backtrace cache
 | 
			
		||||
    extern std::vector<std::string> backtraceStr;
 | 
			
		||||
 | 
			
		||||
    // logic errors
 | 
			
		||||
    DECL_EXC(Logic, std::logic_error);
 | 
			
		||||
    DECL_EXC(Definition, Logic);
 | 
			
		||||
@@ -102,24 +66,6 @@ namespace Exceptions
 | 
			
		||||
    DECL_EXC(Program, Runtime);
 | 
			
		||||
    DECL_EXC(System, Runtime);
 | 
			
		||||
 | 
			
		||||
    // virtual machine errors
 | 
			
		||||
    class RuntimeRef: public Runtime
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        RuntimeRef(std::string msg, std::string loc, const unsigned int address)
 | 
			
		||||
        : Runtime(msg, loc), address_(address)
 | 
			
		||||
        {}
 | 
			
		||||
        unsigned int getAddress(void) const
 | 
			
		||||
        {
 | 
			
		||||
            return address_;
 | 
			
		||||
        }
 | 
			
		||||
    private:
 | 
			
		||||
        unsigned int address_;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    DECL_EXC_REF(ObjectDefinition, RuntimeRef);
 | 
			
		||||
    DECL_EXC_REF(ObjectType, RuntimeRef);
 | 
			
		||||
 | 
			
		||||
    // abort functions
 | 
			
		||||
    void abort(const std::exception& e);
 | 
			
		||||
}
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Factory.hpp
 | 
			
		||||
Source file: extras/Hadrons/Factory.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -29,7 +29,7 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
#ifndef Hadrons_Factory_hpp_
 | 
			
		||||
#define Hadrons_Factory_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/GeneticScheduler.hpp
 | 
			
		||||
Source file: extras/Hadrons/GeneticScheduler.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -29,8 +29,8 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
#ifndef Hadrons_GeneticScheduler_hpp_
 | 
			
		||||
#define Hadrons_GeneticScheduler_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Graph.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Graph.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Global.cc
 | 
			
		||||
Source file: extras/Hadrons/Global.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -26,7 +26,7 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace QCD;
 | 
			
		||||
@@ -72,11 +72,6 @@ void Hadrons::initLogger(void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// type utilities //////////////////////////////////////////////////////////////
 | 
			
		||||
size_t Hadrons::typeHash(const std::type_info *info)
 | 
			
		||||
{
 | 
			
		||||
    return info->hash_code();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
constexpr unsigned int maxNameSize = 1024u;
 | 
			
		||||
 | 
			
		||||
std::string Hadrons::typeName(const std::type_info *info)
 | 
			
		||||
@@ -178,31 +173,3 @@ void Hadrons::makeFileDir(const std::string filename, GridBase *g)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Hadrons::printTimeProfile(const std::map<std::string, GridTime> &timing, 
 | 
			
		||||
                               GridTime total)
 | 
			
		||||
{
 | 
			
		||||
    typedef decltype(total.count()) Count;
 | 
			
		||||
 | 
			
		||||
    std::map<Count, std::string, std::greater<Count>> rtiming;
 | 
			
		||||
    const double dtotal = static_cast<double>(total.count());
 | 
			
		||||
    auto cf = std::cout.flags();
 | 
			
		||||
    auto p  = std::cout.precision();
 | 
			
		||||
    unsigned int width = 0;
 | 
			
		||||
 | 
			
		||||
    for (auto &t: timing)
 | 
			
		||||
    {
 | 
			
		||||
        width = std::max(width, static_cast<unsigned int>(t.first.length()));
 | 
			
		||||
        rtiming[t.second.count()] = t.first;
 | 
			
		||||
    }
 | 
			
		||||
    for (auto &rt: rtiming)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(Message) << std::setw(width) << rt.second << ": " 
 | 
			
		||||
                     << rt.first << " us (" << std::fixed 
 | 
			
		||||
                     << std::setprecision(1) 
 | 
			
		||||
                     << static_cast<double>(rt.first)/dtotal*100 << "%)"
 | 
			
		||||
                     << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    std::cout.flags(cf);
 | 
			
		||||
    std::cout.precision(p);
 | 
			
		||||
}
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Global.hpp
 | 
			
		||||
Source file: extras/Hadrons/Global.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -62,56 +62,35 @@ using Grid::operator>>;
 | 
			
		||||
 | 
			
		||||
#define END_MODULE_NAMESPACE }
 | 
			
		||||
 | 
			
		||||
#define _HADRONS_IMPL(impl, sub) impl##sub
 | 
			
		||||
#define HADRONS_IMPL(impl, sub)   _HADRONS_IMPL(impl, sub)
 | 
			
		||||
 | 
			
		||||
#ifndef FIMPLBASE
 | 
			
		||||
#define FIMPLBASE WilsonImpl
 | 
			
		||||
#ifndef FIMPL
 | 
			
		||||
#define FIMPL WilsonImplR
 | 
			
		||||
#endif
 | 
			
		||||
#define FIMPL  HADRONS_IMPL(FIMPLBASE, R)
 | 
			
		||||
#define FIMPLF HADRONS_IMPL(FIMPLBASE, F)
 | 
			
		||||
#define FIMPLD HADRONS_IMPL(FIMPLBASE, D)
 | 
			
		||||
 | 
			
		||||
#ifndef ZFIMPLBASE
 | 
			
		||||
#define ZFIMPLBASE ZWilsonImpl
 | 
			
		||||
#ifndef ZFIMPL
 | 
			
		||||
#define ZFIMPL ZWilsonImplR
 | 
			
		||||
#endif
 | 
			
		||||
#define ZFIMPL  HADRONS_IMPL(ZFIMPLBASE, R)
 | 
			
		||||
#define ZFIMPLF HADRONS_IMPL(ZFIMPLBASE, F)
 | 
			
		||||
#define ZFIMPLD HADRONS_IMPL(ZFIMPLBASE, D)
 | 
			
		||||
 | 
			
		||||
#ifndef SIMPLBASE
 | 
			
		||||
#define SIMPLBASE ScalarImplC
 | 
			
		||||
#ifndef SIMPL
 | 
			
		||||
#define SIMPL ScalarImplCR
 | 
			
		||||
#endif
 | 
			
		||||
#define SIMPL  HADRONS_IMPL(SIMPLBASE, R)
 | 
			
		||||
#define SIMPLF HADRONS_IMPL(SIMPLBASE, F)
 | 
			
		||||
#define SIMPLD HADRONS_IMPL(SIMPLBASE, D)
 | 
			
		||||
 | 
			
		||||
#ifndef GIMPLBASE
 | 
			
		||||
#define GIMPLBASE PeriodicGimpl
 | 
			
		||||
#ifndef GIMPL
 | 
			
		||||
#define GIMPL PeriodicGimplR
 | 
			
		||||
#endif
 | 
			
		||||
#define GIMPL  HADRONS_IMPL(GIMPLBASE, R)
 | 
			
		||||
#define GIMPLF HADRONS_IMPL(GIMPLBASE, F)
 | 
			
		||||
#define GIMPLD HADRONS_IMPL(GIMPLBASE, D)
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
// type aliases
 | 
			
		||||
#define BASIC_TYPE_ALIASES(Impl, suffix)\
 | 
			
		||||
typedef typename Impl::Field                         ScalarField##suffix;\
 | 
			
		||||
typedef typename Impl::PropagatorField               PropagatorField##suffix;\
 | 
			
		||||
typedef typename Impl::SitePropagator::scalar_object SitePropagator##suffix;\
 | 
			
		||||
typedef std::vector<SitePropagator##suffix>          SlicedPropagator##suffix;
 | 
			
		||||
 | 
			
		||||
#define FERM_TYPE_ALIASES(FImpl, suffix)\
 | 
			
		||||
BASIC_TYPE_ALIASES(FImpl, suffix);\
 | 
			
		||||
typedef FermionOperator<FImpl>                        FMat##suffix;            \
 | 
			
		||||
typedef typename FImpl::FermionField                  FermionField##suffix;    \
 | 
			
		||||
typedef typename FImpl::GaugeField        GaugeField##suffix;\
 | 
			
		||||
typedef typename FImpl::DoubledGaugeField DoubledGaugeField##suffix;\
 | 
			
		||||
typedef typename FImpl::ComplexField      ComplexField##suffix;
 | 
			
		||||
typedef typename FImpl::PropagatorField               PropagatorField##suffix; \
 | 
			
		||||
typedef typename FImpl::SitePropagator::scalar_object SitePropagator##suffix;  \
 | 
			
		||||
typedef std::vector<SitePropagator##suffix>           SlicedPropagator##suffix;
 | 
			
		||||
 | 
			
		||||
#define GAUGE_TYPE_ALIASES(GImpl, suffix)\
 | 
			
		||||
typedef typename GImpl::GaugeField GaugeField##suffix;
 | 
			
		||||
#define GAUGE_TYPE_ALIASES(FImpl, suffix)\
 | 
			
		||||
typedef typename FImpl::DoubledGaugeField DoubledGaugeField##suffix;
 | 
			
		||||
 | 
			
		||||
#define SCALAR_TYPE_ALIASES(SImpl, suffix)\
 | 
			
		||||
typedef typename SImpl::Field ScalarField##suffix;\
 | 
			
		||||
typedef typename SImpl::Field PropagatorField##suffix;
 | 
			
		||||
 | 
			
		||||
#define SOLVER_TYPE_ALIASES(FImpl, suffix)\
 | 
			
		||||
typedef Solver<FImpl> Solver##suffix;
 | 
			
		||||
@@ -120,6 +99,10 @@ typedef Solver<FImpl> Solver##suffix;
 | 
			
		||||
typedef std::function<SlicedPropagator##suffix\
 | 
			
		||||
                      (const PropagatorField##suffix &)> SinkFn##suffix;
 | 
			
		||||
 | 
			
		||||
#define FG_TYPE_ALIASES(FImpl, suffix)\
 | 
			
		||||
FERM_TYPE_ALIASES(FImpl, suffix)\
 | 
			
		||||
GAUGE_TYPE_ALIASES(FImpl, suffix)
 | 
			
		||||
 | 
			
		||||
// logger
 | 
			
		||||
class HadronsLogger: public Logger
 | 
			
		||||
{
 | 
			
		||||
@@ -172,28 +155,14 @@ 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t typeHash(const std::type_info *info);
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
size_t typeHash(const T &x)
 | 
			
		||||
{
 | 
			
		||||
    return typeHash(typeIdPt(x));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
size_t typeHash(void)
 | 
			
		||||
{
 | 
			
		||||
    return typeHash(typeIdPt<T>());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string typeName(const std::type_info *info);
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
std::string typeName(const T &x)
 | 
			
		||||
{
 | 
			
		||||
@@ -237,19 +206,13 @@ void        makeFileDir(const std::string filename, GridBase *g);
 | 
			
		||||
#define _HADRONS_SCHUR_SOLVE_(conv) SchurRedBlack##conv##Solve
 | 
			
		||||
#define HADRONS_SCHUR_SOLVE(conv) _HADRONS_SCHUR_SOLVE_(conv)
 | 
			
		||||
#define HADRONS_DEFAULT_SCHUR_SOLVE HADRONS_SCHUR_SOLVE(HADRONS_DEFAULT_SCHUR)
 | 
			
		||||
#define _HADRONS_SCHUR_A2A_(conv) A2AVectorsSchur##conv
 | 
			
		||||
#define HADRONS_SCHUR_A2A(conv) _HADRONS_SCHUR_A2A_(conv)
 | 
			
		||||
#define HADRONS_DEFAULT_SCHUR_A2A HADRONS_SCHUR_A2A(HADRONS_DEFAULT_SCHUR)
 | 
			
		||||
 | 
			
		||||
// stringify macro
 | 
			
		||||
#define _HADRONS_STR(x) #x
 | 
			
		||||
#define HADRONS_STR(x) _HADRONS_STR(x)
 | 
			
		||||
 | 
			
		||||
// pretty print time profile
 | 
			
		||||
void printTimeProfile(const std::map<std::string, GridTime> &timing, GridTime total);
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Exceptions.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Exceptions.hpp>
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_Global_hpp_
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Graph.hpp
 | 
			
		||||
Source file: extras/Hadrons/Graph.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -29,7 +29,7 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
#ifndef Hadrons_Graph_hpp_
 | 
			
		||||
#define Hadrons_Graph_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Utilities/HadronsXmlRun.cc
 | 
			
		||||
Source file: extras/Hadrons/HadronsXmlRun.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -26,7 +26,7 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Application.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Application.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace QCD;
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
SUBDIRS = . Utilities
 | 
			
		||||
 | 
			
		||||
lib_LIBRARIES = libHadrons.a
 | 
			
		||||
bin_PROGRAMS  = HadronsXmlRun
 | 
			
		||||
 | 
			
		||||
include modules.inc
 | 
			
		||||
 | 
			
		||||
@@ -11,16 +10,13 @@ libHadrons_a_SOURCES = \
 | 
			
		||||
	Exceptions.cc      \
 | 
			
		||||
    Global.cc          \
 | 
			
		||||
    Module.cc		   \
 | 
			
		||||
	TimerArray.cc      \
 | 
			
		||||
	VirtualMachine.cc
 | 
			
		||||
libHadrons_adir = $(includedir)/Hadrons
 | 
			
		||||
libHadrons_adir = $(pkgincludedir)/Hadrons
 | 
			
		||||
nobase_libHadrons_a_HEADERS = \
 | 
			
		||||
	$(modules_hpp)            \
 | 
			
		||||
	A2AVectors.hpp            \
 | 
			
		||||
	A2AMatrix.hpp             \
 | 
			
		||||
	AllToAllVectors.hpp       \
 | 
			
		||||
	AllToAllReduction.hpp       \
 | 
			
		||||
	Application.hpp           \
 | 
			
		||||
	DilutedNoise.hpp          \
 | 
			
		||||
	DiskVector.hpp            \
 | 
			
		||||
	EigenPack.hpp             \
 | 
			
		||||
	Environment.hpp           \
 | 
			
		||||
	Exceptions.hpp            \
 | 
			
		||||
@@ -32,5 +28,7 @@ nobase_libHadrons_a_HEADERS = \
 | 
			
		||||
	Modules.hpp               \
 | 
			
		||||
	ModuleFactory.hpp         \
 | 
			
		||||
	Solver.hpp                \
 | 
			
		||||
	TimerArray.hpp            \
 | 
			
		||||
	VirtualMachine.hpp
 | 
			
		||||
 | 
			
		||||
HadronsXmlRun_SOURCES = HadronsXmlRun.cc
 | 
			
		||||
HadronsXmlRun_LDADD   = libHadrons.a -lGrid
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Module.cc
 | 
			
		||||
Source file: extras/Hadrons/Module.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -26,7 +26,7 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace QCD;
 | 
			
		||||
@@ -56,40 +56,6 @@ std::string ModuleBase::getRegisteredName(void)
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
void ModuleBase::operator()(void)
 | 
			
		||||
{
 | 
			
		||||
    resetTimers();
 | 
			
		||||
    startTimer("_total");
 | 
			
		||||
    startTimer("_setup");
 | 
			
		||||
    setup();
 | 
			
		||||
    stopTimer("_setup");
 | 
			
		||||
    startTimer("_execute");
 | 
			
		||||
    execute();
 | 
			
		||||
    stopAllTimers();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string ModuleBase::makeSeedString(void)
 | 
			
		||||
{
 | 
			
		||||
    std::string seed;
 | 
			
		||||
 | 
			
		||||
    if (!vm().getRunId().empty())
 | 
			
		||||
    {
 | 
			
		||||
        seed += vm().getRunId() + "-";
 | 
			
		||||
    }
 | 
			
		||||
    seed += getName() + "-" + std::to_string(vm().getTrajectory());
 | 
			
		||||
 | 
			
		||||
    return seed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GridParallelRNG & ModuleBase::rng4d(void)
 | 
			
		||||
{
 | 
			
		||||
    auto &r = *env().get4dRng();
 | 
			
		||||
 | 
			
		||||
    if (makeSeedString() != seed_)
 | 
			
		||||
    {
 | 
			
		||||
        seed_ = makeSeedString();
 | 
			
		||||
        LOG(Message) << "Seeding 4D RNG " << &r << " with string '" 
 | 
			
		||||
                     << seed_ << "'" << std::endl;
 | 
			
		||||
        r.SeedUniqueString(seed_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Module.hpp
 | 
			
		||||
Source file: extras/Hadrons/Module.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -29,9 +29,8 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
#ifndef Hadrons_Module_hpp_
 | 
			
		||||
#define Hadrons_Module_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/TimerArray.hpp>
 | 
			
		||||
#include <Hadrons/VirtualMachine.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/VirtualMachine.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
@@ -66,26 +65,7 @@ extern template class base;\
 | 
			
		||||
MODULE_REGISTER(mod, ARG(base), ns);
 | 
			
		||||
 | 
			
		||||
#define ARG(...) __VA_ARGS__
 | 
			
		||||
#define HADRONS_MACRO_REDIRECT_12(arg1, arg2, macro, ...) macro
 | 
			
		||||
#define HADRONS_MACRO_REDIRECT_23(arg1, arg2, arg3, macro, ...) macro
 | 
			
		||||
 | 
			
		||||
#define envGetGrid4(latticeType)\
 | 
			
		||||
env().template getGrid<typename latticeType::vector_type>()
 | 
			
		||||
 | 
			
		||||
#define envGetGrid5(latticeType, Ls)\
 | 
			
		||||
env().template getGrid<typename latticeType::vector_type>(Ls)
 | 
			
		||||
 | 
			
		||||
#define envGetGrid(...)\
 | 
			
		||||
HADRONS_MACRO_REDIRECT_12(__VA_ARGS__, envGetGrid5, envGetGrid4)(__VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
#define envGetRbGrid4(latticeType)\
 | 
			
		||||
env().template getRbGrid<typename latticeType::vector_type>()
 | 
			
		||||
 | 
			
		||||
#define envGetRbGrid5(latticeType, Ls)\
 | 
			
		||||
env().template getRbGrid<typename latticeType::vector_type>(Ls)
 | 
			
		||||
 | 
			
		||||
#define envGetRbGrid(...)\
 | 
			
		||||
HADRONS_MACRO_REDIRECT_12(__VA_ARGS__, envGetRbGrid5, envGetRbGrid4)(__VA_ARGS__)
 | 
			
		||||
#define MACRO_REDIRECT(arg1, arg2, arg3, macro, ...) macro
 | 
			
		||||
 | 
			
		||||
#define envGet(type, name)\
 | 
			
		||||
*env().template getObject<type>(name)
 | 
			
		||||
@@ -106,38 +86,38 @@ env().template createObject<type>(name, Environment::Storage::object, Ls, __VA_A
 | 
			
		||||
env().template createDerivedObject<base, type>(name, Environment::Storage::object, Ls, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
#define envCreateLat4(type, name)\
 | 
			
		||||
envCreate(type, name, 1, envGetGrid(type))
 | 
			
		||||
envCreate(type, name, 1, env().getGrid())
 | 
			
		||||
 | 
			
		||||
#define envCreateLat5(type, name, Ls)\
 | 
			
		||||
envCreate(type, name, Ls, envGetGrid(type, Ls))
 | 
			
		||||
envCreate(type, name, Ls, env().getGrid(Ls))
 | 
			
		||||
 | 
			
		||||
#define envCreateLat(...)\
 | 
			
		||||
HADRONS_MACRO_REDIRECT_23(__VA_ARGS__, envCreateLat5, envCreateLat4)(__VA_ARGS__)
 | 
			
		||||
MACRO_REDIRECT(__VA_ARGS__, envCreateLat5, envCreateLat4)(__VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
#define envCache(type, name, Ls, ...)\
 | 
			
		||||
env().template createObject<type>(name, Environment::Storage::cache, Ls, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
#define envCacheLat4(type, name)\
 | 
			
		||||
envCache(type, name, 1, envGetGrid(type))
 | 
			
		||||
envCache(type, name, 1, env().getGrid())
 | 
			
		||||
 | 
			
		||||
#define envCacheLat5(type, name, Ls)\
 | 
			
		||||
envCache(type, name, Ls, envGetGrid(type, Ls))
 | 
			
		||||
envCache(type, name, Ls, env().getGrid(Ls))
 | 
			
		||||
 | 
			
		||||
#define envCacheLat(...)\
 | 
			
		||||
HADRONS_MACRO_REDIRECT_23(__VA_ARGS__, envCacheLat5, envCacheLat4)(__VA_ARGS__)
 | 
			
		||||
MACRO_REDIRECT(__VA_ARGS__, envCacheLat5, envCacheLat4)(__VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
#define envTmp(type, name, Ls, ...)\
 | 
			
		||||
env().template createObject<type>(getName() + "_tmp_" + name,         \
 | 
			
		||||
                                  Environment::Storage::temporary, Ls, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
#define envTmpLat4(type, name)\
 | 
			
		||||
envTmp(type, name, 1, envGetGrid(type))
 | 
			
		||||
envTmp(type, name, 1, env().getGrid())
 | 
			
		||||
 | 
			
		||||
#define envTmpLat5(type, name, Ls)\
 | 
			
		||||
envTmp(type, name, Ls, envGetGrid(type, Ls))
 | 
			
		||||
envTmp(type, name, Ls, env().getGrid(Ls))
 | 
			
		||||
 | 
			
		||||
#define envTmpLat(...)\
 | 
			
		||||
HADRONS_MACRO_REDIRECT_23(__VA_ARGS__, envTmpLat5, envTmpLat4)(__VA_ARGS__)
 | 
			
		||||
MACRO_REDIRECT(__VA_ARGS__, envTmpLat5, envTmpLat4)(__VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
#define saveResult(ioStem, name, result)\
 | 
			
		||||
if (env().getGrid()->IsBoss() and !ioStem.empty())\
 | 
			
		||||
@@ -153,7 +133,7 @@ if (env().getGrid()->IsBoss() and !ioStem.empty())\
 | 
			
		||||
 *                            Module class                                    *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// base class
 | 
			
		||||
class ModuleBase: public TimerArray
 | 
			
		||||
class ModuleBase
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
@@ -186,13 +166,8 @@ protected:
 | 
			
		||||
    DEFINE_ENV_ALIAS;
 | 
			
		||||
    // virtual machine shortcut
 | 
			
		||||
    DEFINE_VM_ALIAS;
 | 
			
		||||
    // RNG seeded from module string
 | 
			
		||||
    GridParallelRNG &rng4d(void);
 | 
			
		||||
private:
 | 
			
		||||
    std::string makeSeedString(void);
 | 
			
		||||
private:
 | 
			
		||||
    std::string                          name_, currentTimer_, seed_;
 | 
			
		||||
    std::map<std::string, GridStopWatch> timer_; 
 | 
			
		||||
    std::string name_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// derived class, templating the parameter class
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/ModuleFactory.hpp
 | 
			
		||||
Source file: extras/Hadrons/ModuleFactory.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
#ifndef Hadrons_ModuleFactory_hpp_
 | 
			
		||||
#define Hadrons_ModuleFactory_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Factory.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Factory.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										62
									
								
								extras/Hadrons/Modules.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								extras/Hadrons/Modules.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/TrKinetic.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/StochFreeField.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/Grad.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/TransProj.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/Div.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/TrMag.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/Utils.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/EMT.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/TwoPoint.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalarSUN/TrPhi.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalar/FreeProp.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalar/Scalar.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalar/ScalarVP.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalar/ChargedProp.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalar/VPCounterTerms.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MLoop/NoiseLoop.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MIO/LoadEigenPack.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MIO/LoadBinary.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MIO/LoadNersc.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSink/Smear.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSink/Point.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MFermion/FreeProp.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MFermion/GaugeProp.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/FundtoHirep.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/Random.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/StoutSmearing.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/Unit.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/StochEm.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/UnitEm.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MUtilities/TestSeqGamma.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MUtilities/TestSeqConserved.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/SeqConserved.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/Z2.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/Wall.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/SeqGamma.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/Point.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/MesonFieldGamma.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/Baryon.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/A2APionField.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/Meson.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/WeakHamiltonian.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/Gamma3pt.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/DiscLoop.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/A2AMeson.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/WardIdentity.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/A2AMesonField.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/WilsonClover.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/ScaledDWF.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/MobiusDWF.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/Wilson.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/DWF.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/ZMobiusDWF.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSolver/RBPrecCG.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSolver/A2AVectors.hpp>
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MAction/DWF.cc
 | 
			
		||||
Source file: extras/Hadrons/Modules/MAction/DWF.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -25,13 +25,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
See the full license in the file "LICENSE" in the top level distribution directory
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
#include <Hadrons/Modules/MAction/DWF.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/DWF.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MAction;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MAction::TDWF<FIMPL>;
 | 
			
		||||
#ifdef GRID_DEFAULT_PRECISION_DOUBLE
 | 
			
		||||
template class Grid::Hadrons::MAction::TDWF<FIMPLF>;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MAction/DWF.hpp
 | 
			
		||||
Source file: extras/Hadrons/Modules/MAction/DWF.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
#ifndef Hadrons_MAction_DWF_hpp_
 | 
			
		||||
#define Hadrons_MAction_DWF_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
@@ -49,15 +49,14 @@ public:
 | 
			
		||||
                                    unsigned int, Ls,
 | 
			
		||||
                                    double      , mass,
 | 
			
		||||
                                    double      , M5,
 | 
			
		||||
                                    std::string , boundary,
 | 
			
		||||
                                    std::string , twist);
 | 
			
		||||
                                    std::string , boundary);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TDWF: public Module<DWFPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
    FG_TYPE_ALIASES(FImpl,);
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TDWF(const std::string name);
 | 
			
		||||
@@ -73,10 +72,8 @@ protected:
 | 
			
		||||
    virtual void execute(void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern template class TDWF<FIMPL>;
 | 
			
		||||
MODULE_REGISTER_TMP(DWF, TDWF<FIMPL>, MAction);
 | 
			
		||||
#ifdef GRID_DEFAULT_PRECISION_DOUBLE
 | 
			
		||||
MODULE_REGISTER_TMP(DWFF, TDWF<FIMPLF>, MAction);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                        DWF template implementation                         *
 | 
			
		||||
@@ -115,14 +112,14 @@ void TDWF<FImpl>::setup(void)
 | 
			
		||||
    LOG(Message) << "Fermion boundary conditions: " << par().boundary
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
                 
 | 
			
		||||
    auto &U    = envGet(GaugeField, par().gauge);
 | 
			
		||||
    auto &g4   = *envGetGrid(FermionField);
 | 
			
		||||
    auto &grb4 = *envGetRbGrid(FermionField);
 | 
			
		||||
    auto &g5   = *envGetGrid(FermionField, par().Ls);
 | 
			
		||||
    auto &grb5 = *envGetRbGrid(FermionField, par().Ls);
 | 
			
		||||
    typename DomainWallFermion<FImpl>::ImplParams implParams;
 | 
			
		||||
    implParams.boundary_phases = strToVec<Complex>(par().boundary);
 | 
			
		||||
    implParams.twist_n_2pi_L   = strToVec<Real>(par().twist);
 | 
			
		||||
    env().createGrid(par().Ls);
 | 
			
		||||
    auto &U    = envGet(LatticeGaugeField, par().gauge);
 | 
			
		||||
    auto &g4   = *env().getGrid();
 | 
			
		||||
    auto &grb4 = *env().getRbGrid();
 | 
			
		||||
    auto &g5   = *env().getGrid(par().Ls);
 | 
			
		||||
    auto &grb5 = *env().getRbGrid(par().Ls);
 | 
			
		||||
    std::vector<Complex> boundary = strToVec<Complex>(par().boundary);
 | 
			
		||||
    typename DomainWallFermion<FImpl>::ImplParams implParams(boundary);
 | 
			
		||||
    envCreateDerived(FMat, DomainWallFermion<FImpl>, getName(), par().Ls, U, g5,
 | 
			
		||||
                     grb5, g4, grb4, par().mass, par().M5, implParams);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								extras/Hadrons/Modules/MAction/MobiusDWF.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								extras/Hadrons/Modules/MAction/MobiusDWF.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/MobiusDWF.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MAction;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MAction::TMobiusDWF<FIMPL>;
 | 
			
		||||
@@ -1,36 +1,9 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MAction/MobiusDWF.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_MAction_MobiusDWF_hpp_
 | 
			
		||||
#define Hadrons_MAction_MobiusDWF_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
@@ -49,15 +22,14 @@ public:
 | 
			
		||||
                                    double      , M5,
 | 
			
		||||
                                    double      , b,
 | 
			
		||||
                                    double      , c,
 | 
			
		||||
                                    std::string , boundary,
 | 
			
		||||
                                    std::string , twist);
 | 
			
		||||
                                    std::string , boundary);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TMobiusDWF: public Module<MobiusDWFPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
    FG_TYPE_ALIASES(FImpl,);
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TMobiusDWF(const std::string name);
 | 
			
		||||
@@ -73,9 +45,6 @@ public:
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER_TMP(MobiusDWF, TMobiusDWF<FIMPL>, MAction);
 | 
			
		||||
#ifdef GRID_DEFAULT_PRECISION_DOUBLE
 | 
			
		||||
MODULE_REGISTER_TMP(MobiusDWFF, TMobiusDWF<FIMPLF>, MAction);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                      TMobiusDWF implementation                             *
 | 
			
		||||
@@ -115,14 +84,14 @@ void TMobiusDWF<FImpl>::setup(void)
 | 
			
		||||
    LOG(Message) << "Fermion boundary conditions: " << par().boundary
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
 | 
			
		||||
    auto &U    = envGet(GaugeField, par().gauge);
 | 
			
		||||
    auto &g4   = *envGetGrid(FermionField);
 | 
			
		||||
    auto &grb4 = *envGetRbGrid(FermionField);
 | 
			
		||||
    auto &g5   = *envGetGrid(FermionField, par().Ls);
 | 
			
		||||
    auto &grb5 = *envGetRbGrid(FermionField, par().Ls);
 | 
			
		||||
    typename MobiusFermion<FImpl>::ImplParams implParams;
 | 
			
		||||
    implParams.boundary_phases = strToVec<Complex>(par().boundary);
 | 
			
		||||
    implParams.twist_n_2pi_L   = strToVec<Real>(par().twist);
 | 
			
		||||
    env().createGrid(par().Ls);
 | 
			
		||||
    auto &U    = envGet(LatticeGaugeField, par().gauge);
 | 
			
		||||
    auto &g4   = *env().getGrid();
 | 
			
		||||
    auto &grb4 = *env().getRbGrid();
 | 
			
		||||
    auto &g5   = *env().getGrid(par().Ls);
 | 
			
		||||
    auto &grb5 = *env().getRbGrid(par().Ls);
 | 
			
		||||
    std::vector<Complex> boundary = strToVec<Complex>(par().boundary);
 | 
			
		||||
    typename MobiusFermion<FImpl>::ImplParams implParams(boundary);
 | 
			
		||||
    envCreateDerived(FMat, MobiusFermion<FImpl>, getName(), par().Ls, U, g5,
 | 
			
		||||
                     grb5, g4, grb4, par().mass, par().M5, par().b, par().c,
 | 
			
		||||
                     implParams);
 | 
			
		||||
							
								
								
									
										7
									
								
								extras/Hadrons/Modules/MAction/ScaledDWF.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								extras/Hadrons/Modules/MAction/ScaledDWF.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/ScaledDWF.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MAction;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MAction::TScaledDWF<FIMPL>;
 | 
			
		||||
@@ -1,36 +1,9 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MAction/ScaledDWF.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
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_MAction_ScaledDWF_hpp_
 | 
			
		||||
#define Hadrons_MAction_ScaledDWF_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
@@ -48,15 +21,14 @@ public:
 | 
			
		||||
                                    double      , mass,
 | 
			
		||||
                                    double      , M5,
 | 
			
		||||
                                    double      , scale,
 | 
			
		||||
                                    std::string , boundary,
 | 
			
		||||
                                    std::string , twist);
 | 
			
		||||
                                    std::string , boundary);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TScaledDWF: public Module<ScaledDWFPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
    FG_TYPE_ALIASES(FImpl,);
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TScaledDWF(const std::string name);
 | 
			
		||||
@@ -72,9 +44,6 @@ public:
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER_TMP(ScaledDWF, TScaledDWF<FIMPL>, MAction);
 | 
			
		||||
#ifdef GRID_DEFAULT_PRECISION_DOUBLE
 | 
			
		||||
MODULE_REGISTER_TMP(ScaledDWFF, TScaledDWF<FIMPLF>, MAction);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                      TScaledDWF implementation                             *
 | 
			
		||||
@@ -114,14 +83,14 @@ void TScaledDWF<FImpl>::setup(void)
 | 
			
		||||
    LOG(Message) << "Fermion boundary conditions: " << par().boundary
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
 | 
			
		||||
    auto &U    = envGet(GaugeField, par().gauge);
 | 
			
		||||
    auto &g4   = *envGetGrid(FermionField);
 | 
			
		||||
    auto &grb4 = *envGetRbGrid(FermionField);
 | 
			
		||||
    auto &g5   = *envGetGrid(FermionField, par().Ls);
 | 
			
		||||
    auto &grb5 = *envGetRbGrid(FermionField, par().Ls);
 | 
			
		||||
    typename ScaledShamirFermion<FImpl>::ImplParams implParams;
 | 
			
		||||
    implParams.boundary_phases = strToVec<Complex>(par().boundary);
 | 
			
		||||
    implParams.twist_n_2pi_L   = strToVec<Real>(par().twist);
 | 
			
		||||
    env().createGrid(par().Ls);
 | 
			
		||||
    auto &U    = envGet(LatticeGaugeField, par().gauge);
 | 
			
		||||
    auto &g4   = *env().getGrid();
 | 
			
		||||
    auto &grb4 = *env().getRbGrid();
 | 
			
		||||
    auto &g5   = *env().getGrid(par().Ls);
 | 
			
		||||
    auto &grb5 = *env().getRbGrid(par().Ls);
 | 
			
		||||
    std::vector<Complex> boundary = strToVec<Complex>(par().boundary);
 | 
			
		||||
    typename MobiusFermion<FImpl>::ImplParams implParams(boundary);
 | 
			
		||||
    envCreateDerived(FMat, ScaledShamirFermion<FImpl>, getName(), par().Ls, U, g5,
 | 
			
		||||
                     grb5, g4, grb4, par().mass, par().M5, par().scale,
 | 
			
		||||
                     implParams);
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MAction/Wilson.cc
 | 
			
		||||
Source file: extras/Hadrons/Modules/MAction/Wilson.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -25,13 +25,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
See the full license in the file "LICENSE" in the top level distribution directory
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
#include <Hadrons/Modules/MAction/Wilson.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/Wilson.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MAction;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MAction::TWilson<FIMPL>;
 | 
			
		||||
#ifdef GRID_DEFAULT_PRECISION_DOUBLE
 | 
			
		||||
template class Grid::Hadrons::MAction::TWilson<FIMPLF>;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MAction/Wilson.hpp
 | 
			
		||||
Source file: extras/Hadrons/Modules/MAction/Wilson.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
#ifndef Hadrons_MAction_Wilson_hpp_
 | 
			
		||||
#define Hadrons_MAction_Wilson_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
@@ -47,16 +47,14 @@ public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonPar,
 | 
			
		||||
                                    std::string, gauge,
 | 
			
		||||
                                    double     , mass,
 | 
			
		||||
                                    std::string, boundary,
 | 
			
		||||
                                    std::string, string,
 | 
			
		||||
                                    std::string, twist);
 | 
			
		||||
                                    std::string, boundary);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TWilson: public Module<WilsonPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
    FG_TYPE_ALIASES(FImpl,);
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TWilson(const std::string name);
 | 
			
		||||
@@ -73,9 +71,6 @@ protected:
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER_TMP(Wilson, TWilson<FIMPL>, MAction);
 | 
			
		||||
#ifdef GRID_DEFAULT_PRECISION_DOUBLE
 | 
			
		||||
MODULE_REGISTER_TMP(WilsonF, TWilson<FIMPLF>, MAction);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                     TWilson template implementation                        *
 | 
			
		||||
@@ -112,12 +107,11 @@ void TWilson<FImpl>::setup(void)
 | 
			
		||||
    LOG(Message) << "Fermion boundary conditions: " << par().boundary
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
                 
 | 
			
		||||
    auto &U      = envGet(GaugeField, par().gauge);
 | 
			
		||||
    auto &grid   = *envGetGrid(FermionField);
 | 
			
		||||
    auto &gridRb = *envGetRbGrid(FermionField);
 | 
			
		||||
    typename WilsonFermion<FImpl>::ImplParams implParams;
 | 
			
		||||
    implParams.boundary_phases = strToVec<Complex>(par().boundary);
 | 
			
		||||
    implParams.twist_n_2pi_L   = strToVec<Real>(par().twist);
 | 
			
		||||
    auto &U      = envGet(LatticeGaugeField, par().gauge);
 | 
			
		||||
    auto &grid   = *env().getGrid();
 | 
			
		||||
    auto &gridRb = *env().getRbGrid();
 | 
			
		||||
    std::vector<Complex> boundary = strToVec<Complex>(par().boundary);
 | 
			
		||||
    typename WilsonFermion<FImpl>::ImplParams implParams(boundary);
 | 
			
		||||
    envCreateDerived(FMat, WilsonFermion<FImpl>, getName(), 1, U, grid, gridRb,
 | 
			
		||||
                     par().mass, implParams);
 | 
			
		||||
}
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MAction/WilsonClover.cc
 | 
			
		||||
Source file: extras/Hadrons/Modules/MAction/WilsonClover.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -25,13 +25,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
See the full license in the file "LICENSE" in the top level distribution directory
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
#include <Hadrons/Modules/MAction/WilsonClover.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/WilsonClover.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MAction;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MAction::TWilsonClover<FIMPL>;
 | 
			
		||||
#ifdef GRID_DEFAULT_PRECISION_DOUBLE
 | 
			
		||||
template class Grid::Hadrons::MAction::TWilsonClover<FIMPLF>;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: Hadrons/Modules/MAction/WilsonClover.hpp
 | 
			
		||||
Source file: extras/Hadrons/Modules/MAction/WilsonClover.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
@@ -31,9 +31,9 @@ See the full license in the file "LICENSE" in the top level distribution directo
 | 
			
		||||
#ifndef Hadrons_MAction_WilsonClover_hpp_
 | 
			
		||||
#define Hadrons_MAction_WilsonClover_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Hadrons/Global.hpp>
 | 
			
		||||
#include <Hadrons/Module.hpp>
 | 
			
		||||
#include <Hadrons/ModuleFactory.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
@@ -51,8 +51,7 @@ public:
 | 
			
		||||
				                    double     , csw_r,
 | 
			
		||||
				                    double     , csw_t,
 | 
			
		||||
				                    WilsonAnisotropyCoefficients ,clover_anisotropy,
 | 
			
		||||
                                    std::string, boundary,
 | 
			
		||||
                                    std::string, twist
 | 
			
		||||
                                    std::string, boundary
 | 
			
		||||
				    );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -60,7 +59,7 @@ template <typename FImpl>
 | 
			
		||||
class TWilsonClover: public Module<WilsonCloverPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl,);
 | 
			
		||||
    FG_TYPE_ALIASES(FImpl,);
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TWilsonClover(const std::string name);
 | 
			
		||||
@@ -76,9 +75,6 @@ public:
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER_TMP(WilsonClover, TWilsonClover<FIMPL>, MAction);
 | 
			
		||||
#ifdef GRID_DEFAULT_PRECISION_DOUBLE
 | 
			
		||||
MODULE_REGISTER_TMP(WilsonCloverF, TWilsonClover<FIMPLF>, MAction);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                     TWilsonClover template implementation                        *
 | 
			
		||||
@@ -117,15 +113,16 @@ void TWilsonClover<FImpl>::setup(void)
 | 
			
		||||
    LOG(Message) << "Clover term csw_r: " << par().csw_r
 | 
			
		||||
                 << " csw_t: " << par().csw_t
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
    auto &U      = envGet(GaugeField, par().gauge);
 | 
			
		||||
    auto &grid   = *envGetGrid(FermionField);
 | 
			
		||||
    auto &gridRb = *envGetRbGrid(FermionField);
 | 
			
		||||
    typename WilsonCloverFermion<FImpl>::ImplParams implParams;
 | 
			
		||||
    implParams.boundary_phases = strToVec<Complex>(par().boundary);
 | 
			
		||||
    implParams.twist_n_2pi_L   = strToVec<Real>(par().twist);
 | 
			
		||||
    envCreateDerived(FMat, WilsonCloverFermion<FImpl>, getName(), 1, U, grid,
 | 
			
		||||
                     gridRb, par().mass, par().csw_r, par().csw_t, 
 | 
			
		||||
                     par().clover_anisotropy, implParams); 
 | 
			
		||||
    auto &U      = envGet(LatticeGaugeField, par().gauge);
 | 
			
		||||
    auto &grid   = *env().getGrid();
 | 
			
		||||
    auto &gridRb = *env().getRbGrid();
 | 
			
		||||
    std::vector<Complex> boundary = strToVec<Complex>(par().boundary);
 | 
			
		||||
    typename WilsonCloverFermion<FImpl>::ImplParams implParams(boundary);
 | 
			
		||||
    envCreateDerived(FMat, WilsonCloverFermion<FImpl>, getName(), 1, U, grid, gridRb, par().mass,
 | 
			
		||||
						  par().csw_r,
 | 
			
		||||
						  par().csw_t,
 | 
			
		||||
					      par().clover_anisotropy,
 | 
			
		||||
						  implParams); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user