mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 14:04:32 +00:00 
			
		
		
		
	@@ -7,6 +7,7 @@
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/Gamma3pt.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/WardIdentity.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MFermion/FreeProp.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MFermion/GaugeProp.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/SeqGamma.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/Point.hpp>
 | 
			
		||||
 
 | 
			
		||||
@@ -45,8 +45,8 @@ BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 - q1: input propagator 1 (string)
 | 
			
		||||
 - q2: input propagator 2 (string)
 | 
			
		||||
 - gammas: gamma products to insert at sink & source, pairs of gamma matrices 
 | 
			
		||||
           (space-separated strings) in angled brackets (i.e. <g_sink g_src>),
 | 
			
		||||
           in a sequence (e.g. "<Gamma5 Gamma5><Gamma5 GammaT>").
 | 
			
		||||
           (space-separated strings) in round brackets (i.e. (g_sink g_src)),
 | 
			
		||||
           in a sequence (e.g. "(Gamma5 Gamma5)(Gamma5 GammaT)").
 | 
			
		||||
 | 
			
		||||
           Special values: "all" - perform all possible contractions.
 | 
			
		||||
 - sink: module to compute the sink to use in contraction (string).
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								extras/Hadrons/Modules/MFermion/FreeProp.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								extras/Hadrons/Modules/MFermion/FreeProp.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: extras/Hadrons/Modules/MFermion/FreeProp.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
Author: Vera Guelpers <V.M.Guelpers@soton.ac.uk>
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License along
 | 
			
		||||
with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 | 
			
		||||
See the full license in the file "LICENSE" in the top level distribution directory
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
#include <Grid/Hadrons/Modules/MFermion/FreeProp.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
using namespace MFermion;
 | 
			
		||||
 | 
			
		||||
template class Grid::Hadrons::MFermion::TFreeProp<FIMPL>;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										189
									
								
								extras/Hadrons/Modules/MFermion/FreeProp.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								extras/Hadrons/Modules/MFermion/FreeProp.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,189 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: extras/Hadrons/Modules/MFermion/FreeProp.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2018
 | 
			
		||||
 | 
			
		||||
Author: Vera Guelpers <V.M.Guelpers@soton.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_MFermion_FreeProp_hpp_
 | 
			
		||||
#define Hadrons_MFermion_FreeProp_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
#include <Grid/Hadrons/Modules/MFermion/GaugeProp.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                         FreeProp                                 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MFermion)
 | 
			
		||||
 | 
			
		||||
class FreePropPar: Serializable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(FreePropPar,
 | 
			
		||||
                                    std::string, source,
 | 
			
		||||
				    std::string,  action,
 | 
			
		||||
				    double, mass,
 | 
			
		||||
				    std::string,  twist);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TFreeProp: public Module<FreePropPar>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    FGS_TYPE_ALIASES(FImpl,);
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TFreeProp(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TFreeProp(void) {};
 | 
			
		||||
    // dependency relation
 | 
			
		||||
    virtual std::vector<std::string> getInput(void);
 | 
			
		||||
    virtual std::vector<std::string> getOutput(void);
 | 
			
		||||
protected:
 | 
			
		||||
    // setup
 | 
			
		||||
    virtual void setup(void);
 | 
			
		||||
    // execution
 | 
			
		||||
    virtual void execute(void);
 | 
			
		||||
private:
 | 
			
		||||
    unsigned int Ls_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER_TMP(FreeProp, TFreeProp<FIMPL>, MFermion);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                 TFreeProp implementation                             *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
TFreeProp<FImpl>::TFreeProp(const std::string name)
 | 
			
		||||
: Module<FreePropPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TFreeProp<FImpl>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in = {par().source, par().action};
 | 
			
		||||
    
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TFreeProp<FImpl>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName(), getName() + "_5d"};
 | 
			
		||||
    
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TFreeProp<FImpl>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    Ls_ = env().getObjectLs(par().action);
 | 
			
		||||
    envCreateLat(PropagatorField, getName());
 | 
			
		||||
    envTmpLat(FermionField, "source", Ls_);
 | 
			
		||||
    envTmpLat(FermionField, "sol", Ls_);
 | 
			
		||||
    envTmpLat(FermionField, "tmp");
 | 
			
		||||
    if (Ls_ > 1)
 | 
			
		||||
    {
 | 
			
		||||
        envCreateLat(PropagatorField, getName() + "_5d", Ls_);
 | 
			
		||||
    }    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TFreeProp<FImpl>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    LOG(Message) << "Computing free fermion propagator '" << getName() << "'"
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
    
 | 
			
		||||
    std::string propName = (Ls_ == 1) ? getName() : (getName() + "_5d");
 | 
			
		||||
    auto        &prop    = envGet(PropagatorField, propName);
 | 
			
		||||
    auto        &fullSrc = envGet(PropagatorField, par().source);
 | 
			
		||||
    auto        &mat = envGet(FMat, par().action);
 | 
			
		||||
    RealD mass = par().mass;
 | 
			
		||||
    
 | 
			
		||||
    envGetTmp(FermionField, source);
 | 
			
		||||
    envGetTmp(FermionField, sol);
 | 
			
		||||
    envGetTmp(FermionField, tmp);
 | 
			
		||||
    LOG(Message) << "Calculating a free Propagator with mass " << mass 
 | 
			
		||||
		 << " using the action '" << par().action
 | 
			
		||||
                 << "' on source '" << par().source << "'" << std::endl;
 | 
			
		||||
    for (unsigned int s = 0; s < Ns; ++s)
 | 
			
		||||
      for (unsigned int c = 0; c < FImpl::Dimension; ++c)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(Message) << "Calculation for spin= " << s << ", color= " << c
 | 
			
		||||
                     << std::endl;
 | 
			
		||||
        // source conversion for 4D sources
 | 
			
		||||
        if (!env().isObject5d(par().source))
 | 
			
		||||
        {
 | 
			
		||||
            if (Ls_ == 1)
 | 
			
		||||
            {
 | 
			
		||||
               PropToFerm<FImpl>(source, fullSrc, s, c);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                PropToFerm<FImpl>(tmp, fullSrc, s, c);
 | 
			
		||||
                make_5D(tmp, source, Ls_);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // source conversion for 5D sources
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if (Ls_ != env().getObjectLs(par().source))
 | 
			
		||||
            {
 | 
			
		||||
                HADRONS_ERROR(Size, "Ls mismatch between quark action and source");
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                PropToFerm<FImpl>(source, fullSrc, s, c);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        sol = zero;
 | 
			
		||||
	std::vector<Real> twist = strToVec<Real>(par().twist);
 | 
			
		||||
	if(twist.size() != Nd) HADRONS_ERROR(Size, "number of twist angles does not match number of dimensions");
 | 
			
		||||
	mat.FreePropagator(source,sol,mass,twist);
 | 
			
		||||
        FermToProp<FImpl>(prop, sol, s, c);
 | 
			
		||||
        // create 4D propagators from 5D one if necessary
 | 
			
		||||
        if (Ls_ > 1)
 | 
			
		||||
        {
 | 
			
		||||
            PropagatorField &p4d = envGet(PropagatorField, getName());
 | 
			
		||||
            make_4D(sol, tmp, Ls_);
 | 
			
		||||
            FermToProp<FImpl>(p4d, tmp, s, c);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MFermion_FreeProp_hpp_
 | 
			
		||||
@@ -7,6 +7,7 @@ modules_cc =\
 | 
			
		||||
  Modules/MContraction/WardIdentity.cc \
 | 
			
		||||
  Modules/MContraction/DiscLoop.cc \
 | 
			
		||||
  Modules/MContraction/Gamma3pt.cc \
 | 
			
		||||
  Modules/MFermion/FreeProp.cc \
 | 
			
		||||
  Modules/MFermion/GaugeProp.cc \
 | 
			
		||||
  Modules/MSource/Point.cc \
 | 
			
		||||
  Modules/MSource/Wall.cc \
 | 
			
		||||
@@ -57,6 +58,7 @@ modules_hpp =\
 | 
			
		||||
  Modules/MContraction/Gamma3pt.hpp \
 | 
			
		||||
  Modules/MContraction/WardIdentity.hpp \
 | 
			
		||||
  Modules/MContraction/WeakHamiltonianEye.hpp \
 | 
			
		||||
  Modules/MFermion/FreeProp.hpp \
 | 
			
		||||
  Modules/MFermion/GaugeProp.hpp \
 | 
			
		||||
  Modules/MSource/SeqGamma.hpp \
 | 
			
		||||
  Modules/MSource/Point.hpp \
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@
 | 
			
		||||
 | 
			
		||||
Author: Peter Boyle <pabobyle@ph.ed.ac.uk>
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
Author: Vera Guelpers <V.M.Guelpers@soton.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
 | 
			
		||||
@@ -42,8 +43,58 @@ namespace Grid {
 | 
			
		||||
     INHERIT_IMPL_TYPES(Impl);
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
      void  MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m) { 
 | 
			
		||||
	this->MomentumSpacePropagatorHt(out,in,_m);
 | 
			
		||||
      void FreePropagator(const FermionField &in,FermionField &out,RealD mass, std::vector<double> twist, bool fiveD) {
 | 
			
		||||
	FermionField in_k(in._grid);
 | 
			
		||||
	FermionField prop_k(in._grid);
 | 
			
		||||
 | 
			
		||||
	FFT theFFT((GridCartesian *) in._grid);
 | 
			
		||||
 | 
			
		||||
	//phase for boundary condition
 | 
			
		||||
	ComplexField coor(in._grid);
 | 
			
		||||
	ComplexField ph(in._grid);  ph = zero;
 | 
			
		||||
	FermionField in_buf(in._grid); in_buf = zero;
 | 
			
		||||
	Complex ci(0.0,1.0);
 | 
			
		||||
	assert(twist.size() == Nd);//check that twist is Nd
 | 
			
		||||
	int shift = 0;
 | 
			
		||||
	if(fiveD) shift = 1;
 | 
			
		||||
	for(unsigned int nu = 0; nu < Nd; nu++)
 | 
			
		||||
	{
 | 
			
		||||
	  // Shift coordinate lattice index by 1 to account for 5th dimension.
 | 
			
		||||
          LatticeCoordinate(coor, nu + shift);
 | 
			
		||||
	  ph = ph + twist[nu]*coor*((1./(in._grid->_fdimensions[nu+shift])));
 | 
			
		||||
	}
 | 
			
		||||
	in_buf = exp((Real)(2.0*M_PI)*ci*ph*(-1.0))*in;
 | 
			
		||||
 | 
			
		||||
	if(fiveD){//FFT only on temporal and spatial dimensions
 | 
			
		||||
          std::vector<int> mask(Nd+1,1); mask[0] = 0;
 | 
			
		||||
	  theFFT.FFT_dim_mask(in_k,in_buf,mask,FFT::forward);
 | 
			
		||||
          this->MomentumSpacePropagatorHt_5d(prop_k,in_k,mass,twist);
 | 
			
		||||
          theFFT.FFT_dim_mask(out,prop_k,mask,FFT::backward);
 | 
			
		||||
        }
 | 
			
		||||
	else{
 | 
			
		||||
	  theFFT.FFT_all_dim(in_k,in,FFT::forward);
 | 
			
		||||
          this->MomentumSpacePropagatorHt(prop_k,in_k,mass,twist);
 | 
			
		||||
	  theFFT.FFT_all_dim(out,prop_k,FFT::backward);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	//phase for boundary condition
 | 
			
		||||
	out = out * exp((Real)(2.0*M_PI)*ci*ph);
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass,std::vector<double> twist) {
 | 
			
		||||
        bool fiveD = true; //5d propagator by default
 | 
			
		||||
        FreePropagator(in,out,mass,twist,fiveD);
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass, bool fiveD) {
 | 
			
		||||
	std::vector<double> twist(Nd,0.0); //default: periodic boundarys in all directions
 | 
			
		||||
        FreePropagator(in,out,mass,twist,fiveD);
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass) {
 | 
			
		||||
        bool fiveD = true; //5d propagator by default
 | 
			
		||||
	std::vector<double> twist(Nd,0.0); //default: periodic boundarys in all directions
 | 
			
		||||
        FreePropagator(in,out,mass,twist,fiveD);
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      virtual void   Instantiatable(void) {};
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@
 | 
			
		||||
Author: Peter Boyle <pabobyle@ph.ed.ac.uk>
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
Author: Peter Boyle <peterboyle@Peters-MacBook-Pro-2.local>
 | 
			
		||||
Author: Vera Guelpers <V.M.Guelpers@soton.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
 | 
			
		||||
@@ -95,17 +96,38 @@ namespace Grid {
 | 
			
		||||
      virtual void  Mdir   (const FermionField &in, FermionField &out,int dir,int disp)=0;   // case by case Wilson, Clover, Cayley, ContFrac, PartFrac
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      virtual void  MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m) { assert(0);};
 | 
			
		||||
      virtual void  MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m,std::vector<double> twist) { assert(0);};
 | 
			
		||||
 | 
			
		||||
      virtual void  FreePropagator(const FermionField &in,FermionField &out,RealD mass) { 
 | 
			
		||||
      virtual void  FreePropagator(const FermionField &in,FermionField &out,RealD mass,std::vector<double> twist) {
 | 
			
		||||
	FFT theFFT((GridCartesian *) in._grid);
 | 
			
		||||
 | 
			
		||||
	FermionField in_k(in._grid);
 | 
			
		||||
	FermionField prop_k(in._grid);
 | 
			
		||||
 | 
			
		||||
	theFFT.FFT_all_dim(in_k,in,FFT::forward);
 | 
			
		||||
        this->MomentumSpacePropagator(prop_k,in_k,mass);
 | 
			
		||||
	//phase for boundary condition
 | 
			
		||||
	ComplexField coor(in._grid);
 | 
			
		||||
	ComplexField ph(in._grid);  ph = zero;
 | 
			
		||||
	FermionField in_buf(in._grid); in_buf = zero;
 | 
			
		||||
	Complex ci(0.0,1.0);
 | 
			
		||||
	assert(twist.size() == Nd);//check that twist is Nd
 | 
			
		||||
	for(unsigned int nu = 0; nu < Nd; nu++)
 | 
			
		||||
	{
 | 
			
		||||
          LatticeCoordinate(coor, nu);
 | 
			
		||||
	  ph = ph + twist[nu]*coor*((1./(in._grid->_fdimensions[nu])));
 | 
			
		||||
	}
 | 
			
		||||
	in_buf = exp((Real)(2.0*M_PI)*ci*ph*(-1.0))*in;
 | 
			
		||||
 | 
			
		||||
	theFFT.FFT_all_dim(in_k,in_buf,FFT::forward);
 | 
			
		||||
        this->MomentumSpacePropagator(prop_k,in_k,mass,twist);
 | 
			
		||||
	theFFT.FFT_all_dim(out,prop_k,FFT::backward);
 | 
			
		||||
 | 
			
		||||
	//phase for boundary condition
 | 
			
		||||
	out = out * exp((Real)(2.0*M_PI)*ci*ph);
 | 
			
		||||
 | 
			
		||||
      };
 | 
			
		||||
      virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass) {
 | 
			
		||||
		std::vector<double> twist(Nd,0.0); //default: periodic boundarys in all directions
 | 
			
		||||
	        FreePropagator(in,out,mass,twist);
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      ///////////////////////////////////////////////
 | 
			
		||||
 
 | 
			
		||||
@@ -42,8 +42,8 @@ namespace Grid {
 | 
			
		||||
     INHERIT_IMPL_TYPES(Impl);
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
     void  MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m) { 
 | 
			
		||||
       this->MomentumSpacePropagatorHw(out,in,_m);
 | 
			
		||||
     void  MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m,std::vector<double> twist) {
 | 
			
		||||
       this->MomentumSpacePropagatorHw(out,in,_m,twist);
 | 
			
		||||
     };
 | 
			
		||||
 | 
			
		||||
     // Constructors
 | 
			
		||||
 
 | 
			
		||||
@@ -162,7 +162,7 @@ void WilsonFermion<Impl>::MooeeInvDag(const FermionField &in, FermionField &out)
 | 
			
		||||
  MooeeInv(in,out);
 | 
			
		||||
}
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonFermion<Impl>::MomentumSpacePropagator(FermionField &out, const FermionField &in,RealD _m) 
 | 
			
		||||
void WilsonFermion<Impl>::MomentumSpacePropagator(FermionField &out, const FermionField &in,RealD _m,std::vector<double> twist)
 | 
			
		||||
{  
 | 
			
		||||
  typedef typename FermionField::vector_type vector_type;
 | 
			
		||||
  typedef typename FermionField::scalar_type ScalComplex;
 | 
			
		||||
@@ -195,6 +195,7 @@ void WilsonFermion<Impl>::MomentumSpacePropagator(FermionField &out, const Fermi
 | 
			
		||||
    RealD TwoPiL =  M_PI * 2.0/ latt_size[mu];
 | 
			
		||||
    
 | 
			
		||||
    kmu = TwoPiL * kmu;
 | 
			
		||||
    kmu = kmu + TwoPiL * one * twist[mu];//momentum for twisted boundary conditions
 | 
			
		||||
    
 | 
			
		||||
    wilson = wilson + 2.0*sin(kmu*0.5)*sin(kmu*0.5); // Wilson term
 | 
			
		||||
    
 | 
			
		||||
 
 | 
			
		||||
@@ -96,7 +96,7 @@ class WilsonFermion : public WilsonKernels<Impl>, public WilsonFermionStatic {
 | 
			
		||||
  virtual void MooeeInv(const FermionField &in, FermionField &out);
 | 
			
		||||
  virtual void MooeeInvDag(const FermionField &in, FermionField &out);
 | 
			
		||||
 | 
			
		||||
  virtual void  MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _mass) ;
 | 
			
		||||
  virtual void  MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _mass,std::vector<double> twist) ;
 | 
			
		||||
 | 
			
		||||
  ////////////////////////
 | 
			
		||||
  // Derivative interface
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ Author: Peter Boyle <peterboyle@Peters-MacBook-Pro-2.local>
 | 
			
		||||
Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
Author: Guido Cossu <guido.cossu@ed.ac.uk>
 | 
			
		||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
 | 
			
		||||
Author: Vera Guelpers <V.M.Guelpers@soton.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
 | 
			
		||||
@@ -563,7 +564,221 @@ void WilsonFermion5D<Impl>::DW(const FermionField &in, FermionField &out,int dag
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonFermion5D<Impl>::MomentumSpacePropagatorHt(FermionField &out,const FermionField &in, RealD mass) 
 | 
			
		||||
void WilsonFermion5D<Impl>::MomentumSpacePropagatorHt_5d(FermionField &out,const FermionField &in, RealD mass,std::vector<double> twist)
 | 
			
		||||
{
 | 
			
		||||
  // what type LatticeComplex 
 | 
			
		||||
  GridBase *_grid = _FourDimGrid;
 | 
			
		||||
  GridBase *_5dgrid = _FiveDimGrid;
 | 
			
		||||
 | 
			
		||||
  conformable(_5dgrid,out._grid);
 | 
			
		||||
 | 
			
		||||
  FermionField   PRsource(_5dgrid);
 | 
			
		||||
  FermionField   PLsource(_5dgrid);
 | 
			
		||||
  FermionField   buf1_4d(_grid);
 | 
			
		||||
  FermionField   buf2_4d(_grid);
 | 
			
		||||
  FermionField   GR(_5dgrid);
 | 
			
		||||
  FermionField   GL(_5dgrid);
 | 
			
		||||
  FermionField   bufL_4d(_grid);
 | 
			
		||||
  FermionField   bufR_4d(_grid);
 | 
			
		||||
 | 
			
		||||
  unsigned int Ls = in._grid->_rdimensions[0];
 | 
			
		||||
  
 | 
			
		||||
  typedef typename FermionField::vector_type vector_type;
 | 
			
		||||
  typedef typename FermionField::scalar_type ScalComplex;
 | 
			
		||||
  typedef iSinglet<ScalComplex> Tcomplex;
 | 
			
		||||
  typedef Lattice<iSinglet<vector_type> > LatComplex;
 | 
			
		||||
  
 | 
			
		||||
  Gamma::Algebra Gmu [] = {
 | 
			
		||||
    Gamma::Algebra::GammaX,
 | 
			
		||||
    Gamma::Algebra::GammaY,
 | 
			
		||||
    Gamma::Algebra::GammaZ,
 | 
			
		||||
    Gamma::Algebra::GammaT
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  Gamma g5(Gamma::Algebra::Gamma5);
 | 
			
		||||
 | 
			
		||||
  std::vector<int> latt_size   = _grid->_fdimensions;
 | 
			
		||||
 | 
			
		||||
  LatComplex    sk(_grid);  sk = zero;
 | 
			
		||||
  LatComplex    sk2(_grid); sk2= zero;
 | 
			
		||||
  LatComplex    W(_grid); W= zero;
 | 
			
		||||
  LatComplex    a(_grid); a= zero;
 | 
			
		||||
  LatComplex    one  (_grid); one = ScalComplex(1.0,0.0);
 | 
			
		||||
  LatComplex 	cosha(_grid);
 | 
			
		||||
  LatComplex 	kmu(_grid);
 | 
			
		||||
  LatComplex 	Wea(_grid);
 | 
			
		||||
  LatComplex 	Wema(_grid);
 | 
			
		||||
  LatComplex 	sinha(_grid);
 | 
			
		||||
  LatComplex 	sinhaLs(_grid);
 | 
			
		||||
  LatComplex 	coshaLs(_grid);
 | 
			
		||||
  LatComplex 	A(_grid);
 | 
			
		||||
  LatComplex 	F(_grid);
 | 
			
		||||
  LatComplex 	App(_grid);
 | 
			
		||||
  LatComplex 	Amm(_grid);
 | 
			
		||||
  LatComplex 	Bpp(_grid);
 | 
			
		||||
  LatComplex 	Bmm(_grid);
 | 
			
		||||
  LatComplex 	ABpm(_grid); //Apm=Amp=Bpm=Bmp
 | 
			
		||||
  LatComplex 	signW(_grid);
 | 
			
		||||
 | 
			
		||||
  ScalComplex ci(0.0,1.0);
 | 
			
		||||
 | 
			
		||||
  for(int mu=0;mu<Nd;mu++) {
 | 
			
		||||
    
 | 
			
		||||
    LatticeCoordinate(kmu,mu);
 | 
			
		||||
    
 | 
			
		||||
    RealD TwoPiL =  M_PI * 2.0/ latt_size[mu];
 | 
			
		||||
    
 | 
			
		||||
    kmu = TwoPiL * kmu;
 | 
			
		||||
    kmu = kmu + TwoPiL * one * twist[mu];//momentum for twisted boundary conditions
 | 
			
		||||
    
 | 
			
		||||
    sk2 = sk2 + 2.0*sin(kmu*0.5)*sin(kmu*0.5);
 | 
			
		||||
    sk  = sk  +     sin(kmu)    *sin(kmu);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  W = one - M5 + sk2;
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////////////
 | 
			
		||||
  // Cosh alpha -> alpha
 | 
			
		||||
  ////////////////////////////////////////////
 | 
			
		||||
  cosha = (one + W*W + sk) / (abs(W)*2.0);
 | 
			
		||||
 | 
			
		||||
  // FIXME Need a Lattice acosh
 | 
			
		||||
  for(int idx=0;idx<_grid->lSites();idx++){
 | 
			
		||||
    std::vector<int> lcoor(Nd);
 | 
			
		||||
    Tcomplex cc;
 | 
			
		||||
    RealD sgn;
 | 
			
		||||
    _grid->LocalIndexToLocalCoor(idx,lcoor);
 | 
			
		||||
    peekLocalSite(cc,cosha,lcoor);
 | 
			
		||||
    assert((double)real(cc)>=1.0);
 | 
			
		||||
    assert(fabs((double)imag(cc))<=1.0e-15);
 | 
			
		||||
    cc = ScalComplex(::acosh(real(cc)),0.0);
 | 
			
		||||
    pokeLocalSite(cc,a,lcoor);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Wea = ( exp( a) * abs(W)  );
 | 
			
		||||
  Wema= ( exp(-a) * abs(W)  );
 | 
			
		||||
  sinha = 0.5*(exp( a) - exp(-a));
 | 
			
		||||
  sinhaLs = 0.5*(exp( a*Ls) - exp(-a*Ls));
 | 
			
		||||
  coshaLs = 0.5*(exp( a*Ls) + exp(-a*Ls));
 | 
			
		||||
 | 
			
		||||
  A = one / (abs(W) * sinha * 2.0) * one / (sinhaLs * 2.0);
 | 
			
		||||
  F = exp( a*Ls) * (one - Wea + (Wema - one) * mass*mass);
 | 
			
		||||
  F = F + exp(-a*Ls) * (Wema - one + (one - Wea) * mass*mass);
 | 
			
		||||
  F = F - abs(W) * sinha * 4.0 * mass;
 | 
			
		||||
 | 
			
		||||
  Bpp =  (A/F) * (exp(-a*Ls*2.0) - one) * (one - Wema) * (one - mass*mass * one);
 | 
			
		||||
  Bmm =  (A/F) * (one - exp(a*Ls*2.0)) * (one - Wea) * (one - mass*mass * one);
 | 
			
		||||
  App =  (A/F) * (exp(-a*Ls*2.0) - one) * exp(-a) * (exp(-a) - abs(W)) * (one - mass*mass * one);
 | 
			
		||||
  Amm =  (A/F) * (one - exp(a*Ls*2.0)) * exp(a) * (exp(a) - abs(W)) * (one - mass*mass * one);
 | 
			
		||||
  ABpm = (A/F) * abs(W) * sinha * 2.0  * (one + mass * coshaLs * 2.0 + mass*mass * one);
 | 
			
		||||
 | 
			
		||||
  //P+ source, P- source
 | 
			
		||||
  PRsource = (in + g5 * in) * 0.5;
 | 
			
		||||
  PLsource = (in - g5 * in) * 0.5;
 | 
			
		||||
 | 
			
		||||
  //calculate GR, GL
 | 
			
		||||
  for(unsigned int ss=1;ss<=Ls;ss++)
 | 
			
		||||
  {
 | 
			
		||||
    bufR_4d = zero;
 | 
			
		||||
    bufL_4d = zero;
 | 
			
		||||
    for(unsigned int tt=1;tt<=Ls;tt++)
 | 
			
		||||
    {
 | 
			
		||||
      //possible sign if W<0
 | 
			
		||||
      if((ss+tt)%2==1) signW = abs(W)/W;
 | 
			
		||||
      else signW = one;
 | 
			
		||||
 | 
			
		||||
      unsigned int f = (ss > tt) ? ss-tt : tt-ss; //f = abs(ss-tt)
 | 
			
		||||
      //GR
 | 
			
		||||
      buf1_4d = zero;
 | 
			
		||||
      ExtractSlice(buf1_4d, PRsource, (tt-1), 0);
 | 
			
		||||
      //G(s,t)
 | 
			
		||||
      bufR_4d = bufR_4d + A * exp(a*Ls) * exp(-a*f) * signW * buf1_4d + A * exp(-a*Ls) * exp(a*f) * signW * buf1_4d;
 | 
			
		||||
      //A++*exp(a(s+t))
 | 
			
		||||
      bufR_4d = bufR_4d + App * exp(a*ss) * exp(a*tt) * signW * buf1_4d ;
 | 
			
		||||
      //A+-*exp(a(s-t))
 | 
			
		||||
      bufR_4d = bufR_4d + ABpm * exp(a*ss) * exp(-a*tt) * signW * buf1_4d ;
 | 
			
		||||
      //A-+*exp(a(-s+t))
 | 
			
		||||
      bufR_4d = bufR_4d + ABpm * exp(-a*ss) * exp(a*tt) * signW * buf1_4d ;
 | 
			
		||||
      //A--*exp(a(-s-t))
 | 
			
		||||
      bufR_4d = bufR_4d + Amm * exp(-a*ss) * exp(-a*tt) * signW * buf1_4d ;
 | 
			
		||||
 | 
			
		||||
      //GL
 | 
			
		||||
      buf2_4d = zero;
 | 
			
		||||
      ExtractSlice(buf2_4d, PLsource, (tt-1), 0);
 | 
			
		||||
      //G(s,t)
 | 
			
		||||
      bufL_4d = bufL_4d + A * exp(a*Ls) * exp(-a*f) * signW * buf2_4d + A * exp(-a*Ls) * exp(a*f) * signW * buf2_4d;
 | 
			
		||||
      //B++*exp(a(s+t))
 | 
			
		||||
      bufL_4d = bufL_4d + Bpp * exp(a*ss) * exp(a*tt) * signW * buf2_4d ;
 | 
			
		||||
      //B+-*exp(a(s-t))
 | 
			
		||||
      bufL_4d = bufL_4d + ABpm * exp(a*ss) * exp(-a*tt) * signW * buf2_4d ;
 | 
			
		||||
      //B-+*exp(a(-s+t))
 | 
			
		||||
      bufL_4d = bufL_4d + ABpm * exp(-a*ss) * exp(a*tt) * signW * buf2_4d ;
 | 
			
		||||
      //B--*exp(a(-s-t))
 | 
			
		||||
      bufL_4d = bufL_4d + Bmm * exp(-a*ss) * exp(-a*tt) * signW * buf2_4d ;
 | 
			
		||||
    }
 | 
			
		||||
    InsertSlice(bufR_4d, GR, (ss-1), 0);
 | 
			
		||||
    InsertSlice(bufL_4d, GL, (ss-1), 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
//calculate propagator
 | 
			
		||||
  for(unsigned int ss=1;ss<=Ls;ss++)
 | 
			
		||||
  {
 | 
			
		||||
    bufR_4d = zero;
 | 
			
		||||
    bufL_4d = zero;
 | 
			
		||||
 | 
			
		||||
    //(i*gamma_mu*sin(p_mu) - W)*(GL*P- source)
 | 
			
		||||
    buf1_4d = zero;
 | 
			
		||||
    ExtractSlice(buf1_4d, GL, (ss-1), 0);
 | 
			
		||||
    buf2_4d = zero;
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++) {
 | 
			
		||||
      LatticeCoordinate(kmu,mu);
 | 
			
		||||
      RealD TwoPiL =  M_PI * 2.0/ latt_size[mu];
 | 
			
		||||
      kmu = TwoPiL * kmu + TwoPiL * one * twist[mu];//twisted boundary
 | 
			
		||||
      buf2_4d = buf2_4d + sin(kmu)*ci*(Gamma(Gmu[mu])*buf1_4d);
 | 
			
		||||
    }
 | 
			
		||||
    bufL_4d = buf2_4d - W * buf1_4d;
 | 
			
		||||
 | 
			
		||||
    //(i*gamma_mu*sin(p_mu) - W)*(GR*P+ source)
 | 
			
		||||
    buf1_4d = zero;
 | 
			
		||||
    ExtractSlice(buf1_4d, GR, (ss-1), 0);
 | 
			
		||||
    buf2_4d = zero;
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++) {
 | 
			
		||||
      LatticeCoordinate(kmu,mu);
 | 
			
		||||
      RealD TwoPiL =  M_PI * 2.0/ latt_size[mu];
 | 
			
		||||
      kmu = TwoPiL * kmu + TwoPiL * one * twist[mu];//twisted boundary
 | 
			
		||||
      buf2_4d = buf2_4d + sin(kmu)*ci*(Gamma(Gmu[mu])*buf1_4d);
 | 
			
		||||
    }
 | 
			
		||||
    bufR_4d = buf2_4d - W * buf1_4d;
 | 
			
		||||
 | 
			
		||||
    //(delta(s-1,u) - m*delta(s,1)*delta(u,Ls))*GL
 | 
			
		||||
    if(ss==1){
 | 
			
		||||
      ExtractSlice(buf1_4d, GL, (Ls-1), 0);
 | 
			
		||||
      bufL_4d = bufL_4d - mass*buf1_4d;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      ExtractSlice(buf1_4d, GL, (ss-2), 0);
 | 
			
		||||
      bufL_4d = bufL_4d + buf1_4d;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //(delta(s+1,u) - m*delta(s,Ls)*delta(u,1))*GR
 | 
			
		||||
    if(ss==Ls){
 | 
			
		||||
      ExtractSlice(buf1_4d, GR, 0, 0);
 | 
			
		||||
      bufR_4d = bufR_4d - mass*buf1_4d;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      ExtractSlice(buf1_4d, GR, ss, 0);
 | 
			
		||||
      bufR_4d = bufR_4d + buf1_4d;
 | 
			
		||||
    }
 | 
			
		||||
    buf1_4d = bufL_4d + bufR_4d;
 | 
			
		||||
    InsertSlice(buf1_4d, out, (ss-1), 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  out = out * (-1.0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonFermion5D<Impl>::MomentumSpacePropagatorHt(FermionField &out,const FermionField &in, RealD mass,std::vector<double> twist)
 | 
			
		||||
{
 | 
			
		||||
  // what type LatticeComplex 
 | 
			
		||||
  GridBase *_grid = _FourDimGrid;
 | 
			
		||||
@@ -606,6 +821,7 @@ void WilsonFermion5D<Impl>::MomentumSpacePropagatorHt(FermionField &out,const Fe
 | 
			
		||||
    RealD TwoPiL =  M_PI * 2.0/ latt_size[mu];
 | 
			
		||||
    
 | 
			
		||||
    kmu = TwoPiL * kmu;
 | 
			
		||||
    kmu = kmu + TwoPiL * one * twist[mu];//momentum for twisted boundary conditions
 | 
			
		||||
    
 | 
			
		||||
    sk2 = sk2 + 2.0*sin(kmu*0.5)*sin(kmu*0.5);
 | 
			
		||||
    sk  = sk  +     sin(kmu)    *sin(kmu); 
 | 
			
		||||
@@ -619,7 +835,7 @@ void WilsonFermion5D<Impl>::MomentumSpacePropagatorHt(FermionField &out,const Fe
 | 
			
		||||
  ////////////////////////////////////////////
 | 
			
		||||
  // Cosh alpha -> alpha
 | 
			
		||||
  ////////////////////////////////////////////
 | 
			
		||||
  cosha =  (one + W*W + sk) / (W*2.0);
 | 
			
		||||
  cosha =  (one + W*W + sk) / (abs(W)*2.0);
 | 
			
		||||
 | 
			
		||||
  // FIXME Need a Lattice acosh
 | 
			
		||||
  for(int idx=0;idx<_grid->lSites();idx++){
 | 
			
		||||
@@ -634,8 +850,8 @@ void WilsonFermion5D<Impl>::MomentumSpacePropagatorHt(FermionField &out,const Fe
 | 
			
		||||
    pokeLocalSite(cc,a,lcoor);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  Wea = ( exp( a) * W  ); 
 | 
			
		||||
  Wema= ( exp(-a) * W  ); 
 | 
			
		||||
  Wea = ( exp( a) * abs(W)  );
 | 
			
		||||
  Wema= ( exp(-a) * abs(W)  );
 | 
			
		||||
  
 | 
			
		||||
  num   = num + ( one - Wema ) * mass * in;
 | 
			
		||||
  denom= ( Wea - one ) + mass*mass * (one - Wema); 
 | 
			
		||||
@@ -643,7 +859,7 @@ void WilsonFermion5D<Impl>::MomentumSpacePropagatorHt(FermionField &out,const Fe
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonFermion5D<Impl>::MomentumSpacePropagatorHw(FermionField &out,const FermionField &in,RealD mass) 
 | 
			
		||||
void WilsonFermion5D<Impl>::MomentumSpacePropagatorHw(FermionField &out,const FermionField &in,RealD mass,std::vector<double> twist)
 | 
			
		||||
{
 | 
			
		||||
    Gamma::Algebra Gmu [] = {
 | 
			
		||||
      Gamma::Algebra::GammaX,
 | 
			
		||||
@@ -683,6 +899,7 @@ void WilsonFermion5D<Impl>::MomentumSpacePropagatorHw(FermionField &out,const Fe
 | 
			
		||||
      RealD TwoPiL =  M_PI * 2.0/ latt_size[mu];
 | 
			
		||||
 | 
			
		||||
      kmu = TwoPiL * kmu;
 | 
			
		||||
      kmu = kmu + TwoPiL * one * twist[mu];//momentum for twisted boundary conditions
 | 
			
		||||
 | 
			
		||||
      sk2 = sk2 + 2.0*sin(kmu*0.5)*sin(kmu*0.5);
 | 
			
		||||
      sk  = sk  + sin(kmu)*sin(kmu); 
 | 
			
		||||
 
 | 
			
		||||
@@ -118,8 +118,9 @@ namespace QCD {
 | 
			
		||||
      virtual void DhopDerivEO(GaugeField &mat,const FermionField &U,const FermionField &V,int dag);
 | 
			
		||||
      virtual void DhopDerivOE(GaugeField &mat,const FermionField &U,const FermionField &V,int dag);
 | 
			
		||||
 | 
			
		||||
      void MomentumSpacePropagatorHt(FermionField &out,const FermionField &in,RealD mass) ;
 | 
			
		||||
      void MomentumSpacePropagatorHw(FermionField &out,const FermionField &in,RealD mass) ;
 | 
			
		||||
      void MomentumSpacePropagatorHt_5d(FermionField &out,const FermionField &in,RealD mass,std::vector<double> twist) ;
 | 
			
		||||
      void MomentumSpacePropagatorHt(FermionField &out,const FermionField &in,RealD mass,std::vector<double> twist) ;
 | 
			
		||||
      void MomentumSpacePropagatorHw(FermionField &out,const FermionField &in,RealD mass,std::vector<double> twist) ;
 | 
			
		||||
 | 
			
		||||
      // Implement hopping term non-hermitian hopping term; half cb or both
 | 
			
		||||
      // Implement s-diagonal DW
 | 
			
		||||
 
 | 
			
		||||
@@ -309,7 +309,8 @@ int main (int argc, char ** argv)
 | 
			
		||||
 | 
			
		||||
    // Momentum space prop
 | 
			
		||||
    std::cout << " Solving by FFT and Feynman rules" <<std::endl;
 | 
			
		||||
    Ddwf.FreePropagator(src,ref,mass) ;
 | 
			
		||||
    bool fiveD = false; //calculate 4d free propagator
 | 
			
		||||
    Ddwf.FreePropagator(src,ref,mass,fiveD) ;
 | 
			
		||||
 | 
			
		||||
    Gamma G5(Gamma::Algebra::Gamma5);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -190,7 +190,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
        mesPar.output  = "QED/pt_" + flavour[i] + flavour[j];
 | 
			
		||||
        mesPar.q1      = "Qpt_" + flavour[i];
 | 
			
		||||
        mesPar.q2      = "Qpt_" + flavour[j];
 | 
			
		||||
        mesPar.gammas  = "<Gamma5 Gamma5>";
 | 
			
		||||
        mesPar.gammas  = "(Gamma5 Gamma5)";
 | 
			
		||||
        mesPar.sink    = "sink";
 | 
			
		||||
        application.createModule<MContraction::Meson>("meson_pt_"
 | 
			
		||||
                                                      + flavour[i] + flavour[j],
 | 
			
		||||
@@ -204,7 +204,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
					+ flavour[i] + "__" + flavour[j];
 | 
			
		||||
        mesPar_seq_T.q1      = "Qpt_" + flavour[i] + "_seq_T" + flavour[i];
 | 
			
		||||
        mesPar_seq_T.q2      = "Qpt_" + flavour[j];
 | 
			
		||||
        mesPar_seq_T.gammas  = "<Gamma5 Gamma5>";
 | 
			
		||||
        mesPar_seq_T.gammas  = "(Gamma5 Gamma5)";
 | 
			
		||||
        mesPar_seq_T.sink    = "sink";
 | 
			
		||||
        application.createModule<MContraction::Meson>("meson_tadpole_pt_" +
 | 
			
		||||
                                                      flavour[i] + "_seq_T" 
 | 
			
		||||
@@ -220,7 +220,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
				+ flavour[j];
 | 
			
		||||
        mesPar_seq_E.q1      = "Qpt_" + flavour[i] + "_seq_V_ph_" + flavour[i];
 | 
			
		||||
        mesPar_seq_E.q2      = "Qpt_" + flavour[j] + "_seq_V_ph_" + flavour[j];
 | 
			
		||||
        mesPar_seq_E.gammas  = "<Gamma5 Gamma5>";
 | 
			
		||||
        mesPar_seq_E.gammas  = "(Gamma5 Gamma5)";
 | 
			
		||||
        mesPar_seq_E.sink    = "sink";
 | 
			
		||||
        application.createModule<MContraction::Meson>("meson_exchange_pt_" 
 | 
			
		||||
					+ flavour[i] + "_seq_V_ph_" + flavour[i] 
 | 
			
		||||
@@ -237,7 +237,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
        mesPar_seq_S.q1      = "Qpt_" + flavour[i] + "_seq_V_ph_" + flavour[i] 
 | 
			
		||||
				+ "_seq_V_ph_" + flavour[i];
 | 
			
		||||
        mesPar_seq_S.q2      = "Qpt_" + flavour[j];
 | 
			
		||||
        mesPar_seq_S.gammas  = "<Gamma5 Gamma5>";
 | 
			
		||||
        mesPar_seq_S.gammas  = "(Gamma5 Gamma5)";
 | 
			
		||||
        mesPar_seq_S.sink    = "sink";
 | 
			
		||||
        application.createModule<MContraction::Meson>("meson_selfenergy_pt_" 
 | 
			
		||||
						    + flavour[i] + "_seq_V_ph_" 
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										245
									
								
								tests/hadrons/Test_free_prop.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										245
									
								
								tests/hadrons/Test_free_prop.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,245 @@
 | 
			
		||||
/*******************************************************************************
 | 
			
		||||
 Grid physics library, www.github.com/paboyle/Grid
 | 
			
		||||
 
 | 
			
		||||
 Source file: tests/hadrons/Test_free_prop.cc
 | 
			
		||||
 
 | 
			
		||||
 Copyright (C) 2015-2018
 | 
			
		||||
 
 | 
			
		||||
 Author: Antonin Portelli <antonin.portelli@me.com>
 | 
			
		||||
 Author: Vera Guelpers    <v.m.guelpers@soton.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.
 | 
			
		||||
 *******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <Grid/Hadrons/Application.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
    // initialization //////////////////////////////////////////////////////////
 | 
			
		||||
    Grid_init(&argc, &argv);
 | 
			
		||||
    HadronsLogError.Active(GridLogError.isActive());
 | 
			
		||||
    HadronsLogWarning.Active(GridLogWarning.isActive());
 | 
			
		||||
    HadronsLogMessage.Active(GridLogMessage.isActive());
 | 
			
		||||
    HadronsLogIterative.Active(GridLogIterative.isActive());
 | 
			
		||||
    HadronsLogDebug.Active(GridLogDebug.isActive());
 | 
			
		||||
    LOG(Message) << "Grid initialized" << std::endl;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // run setup ///////////////////////////////////////////////////////////////
 | 
			
		||||
    Application              application;
 | 
			
		||||
    std::vector<std::string> flavour = {"h"}; //{"l", "s", "c1", "c2", "c3"};
 | 
			
		||||
    std::vector<double>      mass    = {.2}; //{.01, .04, .2  , .25 , .3  };
 | 
			
		||||
    std::vector<std::string> lepton_flavour    = {"mu"};
 | 
			
		||||
    std::vector<double>      lepton_mass    = {.2};
 | 
			
		||||
 | 
			
		||||
    unsigned int  nt    = GridDefaultLatt()[Tp];
 | 
			
		||||
    
 | 
			
		||||
    // global parameters
 | 
			
		||||
    Application::GlobalPar globalPar;
 | 
			
		||||
    globalPar.trajCounter.start = 1500;
 | 
			
		||||
    globalPar.trajCounter.end   = 1520;
 | 
			
		||||
    globalPar.trajCounter.step  = 20;
 | 
			
		||||
    globalPar.seed              = "1 2 3 4";
 | 
			
		||||
    application.setPar(globalPar);
 | 
			
		||||
    // gauge field
 | 
			
		||||
    application.createModule<MGauge::Unit>("gauge");
 | 
			
		||||
    // unit gauge field for lepton 
 | 
			
		||||
    application.createModule<MGauge::Unit>("free_gauge");
 | 
			
		||||
    // pt source
 | 
			
		||||
    MSource::Point::Par ptPar;
 | 
			
		||||
    ptPar.position = "0 0 0 0";
 | 
			
		||||
    application.createModule<MSource::Point>("pt", ptPar);
 | 
			
		||||
    // sink
 | 
			
		||||
    MSink::Point::Par sinkPar;
 | 
			
		||||
    sinkPar.mom = "0 0 0";
 | 
			
		||||
    application.createModule<MSink::ScalarPoint>("sink", sinkPar);
 | 
			
		||||
    
 | 
			
		||||
    // set fermion boundary conditions to be periodic space, antiperiodic time.
 | 
			
		||||
    std::string boundary = "1 1 1 -1";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //Propagators from FFT and Feynman rules
 | 
			
		||||
    for (unsigned int i = 0; i < lepton_mass.size(); ++i)
 | 
			
		||||
    {
 | 
			
		||||
        //DWF actions
 | 
			
		||||
        MAction::DWF::Par actionPar_lep;
 | 
			
		||||
        actionPar_lep.gauge = "free_gauge";
 | 
			
		||||
        actionPar_lep.Ls    = 8;
 | 
			
		||||
        actionPar_lep.M5    = 1.8;
 | 
			
		||||
        actionPar_lep.mass  = lepton_mass[i];
 | 
			
		||||
        actionPar_lep.boundary = boundary;
 | 
			
		||||
        application.createModule<MAction::DWF>("free_DWF_" + lepton_flavour[i], actionPar_lep);
 | 
			
		||||
 | 
			
		||||
        //DWF free propagators
 | 
			
		||||
        MFermion::FreeProp::Par freePar;
 | 
			
		||||
        freePar.source = "pt";
 | 
			
		||||
	freePar.action = "free_DWF_" + lepton_flavour[i];
 | 
			
		||||
	freePar.twist = "0 0 0 0.5";
 | 
			
		||||
        freePar.mass = lepton_mass[i];
 | 
			
		||||
        application.createModule<MFermion::FreeProp>("Lpt_" + lepton_flavour[i],
 | 
			
		||||
							 freePar);
 | 
			
		||||
 | 
			
		||||
        //Wilson actions
 | 
			
		||||
        MAction::Wilson::Par actionPar_lep_W;
 | 
			
		||||
        actionPar_lep_W.gauge = "free_gauge";
 | 
			
		||||
        actionPar_lep_W.mass  = lepton_mass[i];
 | 
			
		||||
        actionPar_lep_W.boundary = boundary;
 | 
			
		||||
        application.createModule<MAction::Wilson>("free_W_" + lepton_flavour[i], actionPar_lep_W);
 | 
			
		||||
 | 
			
		||||
        //Wilson free propagators
 | 
			
		||||
        MFermion::FreeProp::Par freePar_W;
 | 
			
		||||
        freePar_W.source = "pt";
 | 
			
		||||
	freePar_W.action = "free_W_" + lepton_flavour[i];
 | 
			
		||||
	freePar_W.twist = "0 0 0 0.5";
 | 
			
		||||
        freePar_W.mass = lepton_mass[i];
 | 
			
		||||
        application.createModule<MFermion::FreeProp>("W_Lpt_" + lepton_flavour[i],
 | 
			
		||||
							 freePar_W);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //Propagators from inversion
 | 
			
		||||
    for (unsigned int i = 0; i < flavour.size(); ++i)
 | 
			
		||||
    {
 | 
			
		||||
        //DWF actions
 | 
			
		||||
        MAction::DWF::Par actionPar;
 | 
			
		||||
        actionPar.gauge = "gauge";
 | 
			
		||||
        actionPar.Ls    = 8;
 | 
			
		||||
        actionPar.M5    = 1.8;
 | 
			
		||||
        actionPar.mass  = mass[i];
 | 
			
		||||
        actionPar.boundary = boundary;
 | 
			
		||||
        application.createModule<MAction::DWF>("DWF_" + flavour[i], actionPar);
 | 
			
		||||
        
 | 
			
		||||
        // solvers
 | 
			
		||||
        MSolver::RBPrecCG::Par solverPar;
 | 
			
		||||
        solverPar.action       = "DWF_" + flavour[i];
 | 
			
		||||
        solverPar.residual     = 1.0e-8;
 | 
			
		||||
        solverPar.maxIteration = 10000;
 | 
			
		||||
        application.createModule<MSolver::RBPrecCG>("CG_" + flavour[i],
 | 
			
		||||
                                                    solverPar);
 | 
			
		||||
        
 | 
			
		||||
        //DWF propagators
 | 
			
		||||
        MFermion::GaugeProp::Par quarkPar;
 | 
			
		||||
        quarkPar.solver = "CG_" + flavour[i];
 | 
			
		||||
        quarkPar.source = "pt";
 | 
			
		||||
        application.createModule<MFermion::GaugeProp>("Qpt_" + flavour[i],
 | 
			
		||||
							 quarkPar);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //Wilson actions
 | 
			
		||||
        MAction::Wilson::Par actionPar_W;
 | 
			
		||||
        actionPar_W.gauge = "gauge";
 | 
			
		||||
        actionPar_W.mass  = mass[i];
 | 
			
		||||
        actionPar_W.boundary = boundary;
 | 
			
		||||
        application.createModule<MAction::Wilson>("W_" + flavour[i], actionPar_W);
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        // solvers
 | 
			
		||||
        MSolver::RBPrecCG::Par solverPar_W;
 | 
			
		||||
        solverPar_W.action       = "W_" + flavour[i];
 | 
			
		||||
        solverPar_W.residual     = 1.0e-8;
 | 
			
		||||
        solverPar_W.maxIteration = 10000;
 | 
			
		||||
        application.createModule<MSolver::RBPrecCG>("W_CG_" + flavour[i],
 | 
			
		||||
                                                    solverPar_W);
 | 
			
		||||
        
 | 
			
		||||
        //Wilson propagators
 | 
			
		||||
        MFermion::GaugeProp::Par quarkPar_W;
 | 
			
		||||
        quarkPar_W.solver = "W_CG_" + flavour[i];
 | 
			
		||||
        quarkPar_W.source = "pt";
 | 
			
		||||
        application.createModule<MFermion::GaugeProp>("W_Qpt_" + flavour[i],
 | 
			
		||||
							 quarkPar_W);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //2pt contraction for Propagators from FFT and Feynman rules
 | 
			
		||||
    for (unsigned int i = 0; i < lepton_flavour.size(); ++i)
 | 
			
		||||
    for (unsigned int j = i; j < lepton_flavour.size(); ++j)
 | 
			
		||||
    {
 | 
			
		||||
        //2pt function contraction DWF
 | 
			
		||||
        MContraction::Meson::Par freemesPar;
 | 
			
		||||
        freemesPar.output  = "2pt_free/DWF_L_pt_" + lepton_flavour[i] + lepton_flavour[j];
 | 
			
		||||
        freemesPar.q1      = "Lpt_" + lepton_flavour[i];
 | 
			
		||||
        freemesPar.q2      = "Lpt_" + lepton_flavour[j];
 | 
			
		||||
        freemesPar.gammas  = "(Gamma5 Gamma5)";
 | 
			
		||||
        freemesPar.sink    = "sink";
 | 
			
		||||
        application.createModule<MContraction::Meson>("meson_L_pt_"
 | 
			
		||||
                                                      + lepton_flavour[i] + lepton_flavour[j],
 | 
			
		||||
                                                      freemesPar);
 | 
			
		||||
 | 
			
		||||
        //2pt function contraction Wilson
 | 
			
		||||
        MContraction::Meson::Par freemesPar_W;
 | 
			
		||||
        freemesPar_W.output  = "2pt_free/W_L_pt_" + lepton_flavour[i] + lepton_flavour[j];
 | 
			
		||||
        freemesPar_W.q1      = "W_Lpt_" + lepton_flavour[i];
 | 
			
		||||
        freemesPar_W.q2      = "W_Lpt_" + lepton_flavour[j];
 | 
			
		||||
        freemesPar_W.gammas  = "(Gamma5 Gamma5)";
 | 
			
		||||
        freemesPar_W.sink    = "sink";
 | 
			
		||||
        application.createModule<MContraction::Meson>("W_meson_L_pt_"
 | 
			
		||||
                                                      + lepton_flavour[i] + lepton_flavour[j],
 | 
			
		||||
                                                      freemesPar_W);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //2pt contraction for Propagators from inverion
 | 
			
		||||
    for (unsigned int i = 0; i < flavour.size(); ++i)
 | 
			
		||||
    for (unsigned int j = i; j < flavour.size(); ++j)
 | 
			
		||||
    {
 | 
			
		||||
        //2pt function contraction DWF
 | 
			
		||||
        MContraction::Meson::Par mesPar;
 | 
			
		||||
        mesPar.output  = "2pt_free/DWF_pt_" + flavour[i] + flavour[j];
 | 
			
		||||
        mesPar.q1      = "Qpt_" + flavour[i];
 | 
			
		||||
        mesPar.q2      = "Qpt_" + flavour[j];
 | 
			
		||||
        mesPar.gammas  = "(Gamma5 Gamma5)";
 | 
			
		||||
        mesPar.sink    = "sink";
 | 
			
		||||
        application.createModule<MContraction::Meson>("meson_pt_"
 | 
			
		||||
                                                      + flavour[i] + flavour[j],
 | 
			
		||||
                                                      mesPar);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //2pt function contraction Wilson
 | 
			
		||||
        MContraction::Meson::Par mesPar_W;
 | 
			
		||||
        mesPar_W.output  = "2pt_free/W_pt_" + flavour[i] + flavour[j];
 | 
			
		||||
        mesPar_W.q1      = "W_Qpt_" + flavour[i];
 | 
			
		||||
        mesPar_W.q2      = "W_Qpt_" + flavour[j];
 | 
			
		||||
        mesPar_W.gammas  = "(Gamma5 Gamma5)";
 | 
			
		||||
        mesPar_W.sink    = "sink";
 | 
			
		||||
        application.createModule<MContraction::Meson>("W_meson_pt_"
 | 
			
		||||
                                                      + flavour[i] + flavour[j],
 | 
			
		||||
                                                      mesPar_W);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // execution
 | 
			
		||||
    application.saveParameterFile("free_prop.xml");
 | 
			
		||||
    application.run();
 | 
			
		||||
    
 | 
			
		||||
    // epilogue
 | 
			
		||||
    LOG(Message) << "Grid is finalizing now" << std::endl;
 | 
			
		||||
    Grid_finalize();
 | 
			
		||||
    
 | 
			
		||||
    return EXIT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user