mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-02 21:14:32 +00:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			hotfix/unw
			...
			feature/fe
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					f4e6824f22 | ||
| 
						 | 
					ac5cfd33a6 | ||
| 
						 | 
					f605230bbb | 
@@ -1,25 +1,26 @@
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/DWF.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/Wilson.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/Baryon.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/DiscLoop.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/Gamma3pt.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/Meson.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MLoop/NoiseLoop.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MFermion/GaugeProp.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/WeakHamiltonian.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/Meson.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/DiscLoop.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/Baryon.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MFermion/GaugeProp.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/Load.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/Random.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/StochEm.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/Unit.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MLoop/NoiseLoop.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MContraction/Gamma3pt.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/Z2.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/SeqGamma.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/Point.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/Wall.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/Laplacian.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSolver/RBPrecCG.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalar/ChargedProp.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalar/FreeProp.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MScalar/Scalar.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/DWF.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MAction/Wilson.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/StochEm.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/Unit.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/Random.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MGauge/Load.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSink/Point.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSolver/RBPrecCG.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/Point.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/SeqGamma.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/Wall.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Modules/MSource/Z2.hpp>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										153
									
								
								extras/Hadrons/Modules/MSource/Laplacian.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								extras/Hadrons/Modules/MSource/Laplacian.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,153 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
Source file: extras/Hadrons/Modules/MSource/Laplacian.hpp
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2017
 | 
			
		||||
 | 
			
		||||
Author: Guido Cossu <guido.cossu@ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License along
 | 
			
		||||
with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 | 
			
		||||
See the full license in the file "LICENSE" in the top level distribution directory
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
 | 
			
		||||
#ifndef Hadrons_MSource_Laplacian_hpp_
 | 
			
		||||
#define Hadrons_MSource_Laplacian_hpp_
 | 
			
		||||
 | 
			
		||||
#include <Grid/Hadrons/Global.hpp>
 | 
			
		||||
#include <Grid/Hadrons/Module.hpp>
 | 
			
		||||
#include <Grid/Hadrons/ModuleFactory.hpp>
 | 
			
		||||
 | 
			
		||||
BEGIN_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 
 | 
			
		||||
 Laplacian smearing source
 | 
			
		||||
 -----------------------------
 | 
			
		||||
 
 | 
			
		||||
 * options:
 | 
			
		||||
 - source: name of source object to be smeared (string)
 | 
			
		||||
 - N: number of steps (integer)
 | 
			
		||||
 - alpha: smearing parameter (real)
 | 
			
		||||
 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                          Laplace smearing operator                         *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
BEGIN_MODULE_NAMESPACE(MSource)
 | 
			
		||||
 | 
			
		||||
class LaplacianPar : Serializable
 | 
			
		||||
{
 | 
			
		||||
  public:
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(LaplacianPar,
 | 
			
		||||
                                    std::string, source,
 | 
			
		||||
                                    std::string, gauge,
 | 
			
		||||
                                    unsigned int, N,
 | 
			
		||||
                                    double, alpha);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
class TLaplacian : public Module<LaplacianPar>
 | 
			
		||||
{
 | 
			
		||||
  public:
 | 
			
		||||
    FERM_TYPE_ALIASES(FImpl, );
 | 
			
		||||
 | 
			
		||||
  public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TLaplacian(const std::string name);
 | 
			
		||||
    // destructor
 | 
			
		||||
    virtual ~TLaplacian(void) = default;
 | 
			
		||||
    // dependency relation
 | 
			
		||||
    virtual std::vector<std::string> getInput(void);
 | 
			
		||||
    virtual std::vector<std::string> getOutput(void);
 | 
			
		||||
    // setup
 | 
			
		||||
    virtual void setup(void);
 | 
			
		||||
    // execution
 | 
			
		||||
    virtual void execute(void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
MODULE_REGISTER_NS(LaplaceSmearing, TLaplacian<FIMPL>, MSource);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                       TLaplacian template implementation                   *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
TLaplacian<FImpl>::TLaplacian(const std::string name)
 | 
			
		||||
    : Module<LaplacianPar>(name)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TLaplacian<FImpl>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in = {par().source, par().gauge};
 | 
			
		||||
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
std::vector<std::string> TLaplacian<FImpl>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName()};
 | 
			
		||||
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TLaplacian<FImpl>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    env().template registerLattice<PropagatorField>(getName());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// execution ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename FImpl>
 | 
			
		||||
void TLaplacian<FImpl>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    FermionField source(env().getGrid()), tmp(env().getGrid());
 | 
			
		||||
    PropagatorField &SmrSrc = *env().template createLattice<PropagatorField>(getName());
 | 
			
		||||
    PropagatorField &fullSrc = *env().template getObject<PropagatorField>(par().source);
 | 
			
		||||
    auto &U      = *env().template getObject<LatticeGaugeField>(par().gauge);
 | 
			
		||||
    Laplacian<FImpl> LaplaceOperator(env().getGrid());
 | 
			
		||||
    LaplaceOperator.ImportGauge(U);
 | 
			
		||||
    double prefactor = par().alpha / (double)(par().N);
 | 
			
		||||
 | 
			
		||||
    for (unsigned int s = 0; s < Ns; ++s)
 | 
			
		||||
    {
 | 
			
		||||
        for (unsigned int c = 0; c < Nc; ++c)
 | 
			
		||||
        {
 | 
			
		||||
            PropToFerm(source, fullSrc, s, c);
 | 
			
		||||
            for (int smr = 0; smr < par().N; ++smr)
 | 
			
		||||
            {
 | 
			
		||||
                LaplaceOperator.M(source, tmp);
 | 
			
		||||
                source += prefactor * tmp;
 | 
			
		||||
            }
 | 
			
		||||
            FermToProp(SmrSrc, source, s, c);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END_MODULE_NAMESPACE
 | 
			
		||||
 | 
			
		||||
END_HADRONS_NAMESPACE
 | 
			
		||||
 | 
			
		||||
#endif // Hadrons_MSource_Z2_hpp_
 | 
			
		||||
@@ -1,38 +1,39 @@
 | 
			
		||||
modules_cc =\
 | 
			
		||||
  Modules/MContraction/WeakHamiltonianEye.cc \
 | 
			
		||||
  Modules/MContraction/WeakHamiltonianNonEye.cc \
 | 
			
		||||
  Modules/MContraction/WeakNeutral4ptDisc.cc \
 | 
			
		||||
  Modules/MGauge/Load.cc \
 | 
			
		||||
  Modules/MContraction/WeakHamiltonianEye.cc \
 | 
			
		||||
  Modules/MScalar/FreeProp.cc \
 | 
			
		||||
  Modules/MScalar/ChargedProp.cc \
 | 
			
		||||
  Modules/MGauge/Unit.cc \
 | 
			
		||||
  Modules/MGauge/Random.cc \
 | 
			
		||||
  Modules/MGauge/StochEm.cc \
 | 
			
		||||
  Modules/MGauge/Unit.cc \
 | 
			
		||||
  Modules/MScalar/ChargedProp.cc \
 | 
			
		||||
  Modules/MScalar/FreeProp.cc
 | 
			
		||||
  Modules/MGauge/Load.cc
 | 
			
		||||
 | 
			
		||||
modules_hpp =\
 | 
			
		||||
  Modules/MAction/DWF.hpp \
 | 
			
		||||
  Modules/MAction/Wilson.hpp \
 | 
			
		||||
  Modules/MContraction/Baryon.hpp \
 | 
			
		||||
  Modules/MContraction/DiscLoop.hpp \
 | 
			
		||||
  Modules/MContraction/Gamma3pt.hpp \
 | 
			
		||||
  Modules/MContraction/Meson.hpp \
 | 
			
		||||
  Modules/MLoop/NoiseLoop.hpp \
 | 
			
		||||
  Modules/MFermion/GaugeProp.hpp \
 | 
			
		||||
  Modules/MContraction/WeakHamiltonian.hpp \
 | 
			
		||||
  Modules/MContraction/Meson.hpp \
 | 
			
		||||
  Modules/MContraction/DiscLoop.hpp \
 | 
			
		||||
  Modules/MContraction/WeakHamiltonianEye.hpp \
 | 
			
		||||
  Modules/MContraction/Baryon.hpp \
 | 
			
		||||
  Modules/MContraction/WeakHamiltonianNonEye.hpp \
 | 
			
		||||
  Modules/MContraction/WeakNeutral4ptDisc.hpp \
 | 
			
		||||
  Modules/MFermion/GaugeProp.hpp \
 | 
			
		||||
  Modules/MGauge/Load.hpp \
 | 
			
		||||
  Modules/MGauge/Random.hpp \
 | 
			
		||||
  Modules/MGauge/StochEm.hpp \
 | 
			
		||||
  Modules/MGauge/Unit.hpp \
 | 
			
		||||
  Modules/MLoop/NoiseLoop.hpp \
 | 
			
		||||
  Modules/MContraction/Gamma3pt.hpp \
 | 
			
		||||
  Modules/MSource/Z2.hpp \
 | 
			
		||||
  Modules/MSource/SeqGamma.hpp \
 | 
			
		||||
  Modules/MSource/Point.hpp \
 | 
			
		||||
  Modules/MSource/Wall.hpp \
 | 
			
		||||
  Modules/MSource/Laplacian.hpp \
 | 
			
		||||
  Modules/MSolver/RBPrecCG.hpp \
 | 
			
		||||
  Modules/MScalar/ChargedProp.hpp \
 | 
			
		||||
  Modules/MScalar/FreeProp.hpp \
 | 
			
		||||
  Modules/MScalar/Scalar.hpp \
 | 
			
		||||
  Modules/MSink/Point.hpp \
 | 
			
		||||
  Modules/MSolver/RBPrecCG.hpp \
 | 
			
		||||
  Modules/MSource/Point.hpp \
 | 
			
		||||
  Modules/MSource/SeqGamma.hpp \
 | 
			
		||||
  Modules/MSource/Wall.hpp \
 | 
			
		||||
  Modules/MSource/Z2.hpp
 | 
			
		||||
  Modules/MAction/DWF.hpp \
 | 
			
		||||
  Modules/MAction/Wilson.hpp \
 | 
			
		||||
  Modules/MGauge/StochEm.hpp \
 | 
			
		||||
  Modules/MGauge/Unit.hpp \
 | 
			
		||||
  Modules/MGauge/Random.hpp \
 | 
			
		||||
  Modules/MGauge/Load.hpp \
 | 
			
		||||
  Modules/MSink/Point.hpp
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -47,4 +47,8 @@ Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
////////////////////////////////////////
 | 
			
		||||
#include <Grid/qcd/action/pseudofermion/PseudoFermion.h>
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////
 | 
			
		||||
// Laplacian on fermion fields
 | 
			
		||||
////////////////////////////////////////////////////////////////////////
 | 
			
		||||
#include <Grid/qcd/utils/CovariantLaplacian.h>
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -53,7 +53,7 @@ directory
 | 
			
		||||
// Utility functions
 | 
			
		||||
////////////////////////////////////////////
 | 
			
		||||
#include <Grid/qcd/utils/Metric.h>
 | 
			
		||||
#include <Grid/qcd/utils/CovariantLaplacian.h>
 | 
			
		||||
#include <Grid/qcd/utils/CovariantAdjointLaplacian.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -60,11 +60,11 @@ namespace QCD {
 | 
			
		||||
        Approx::zolotarev_free(zdata);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /***************************************************************
 | 
			
		||||
    /* Additional EOFA operators only called outside the inverter.
 | 
			
		||||
    /* Since speed is not essential, simple axpby-style
 | 
			
		||||
    /* implementations should be fine.
 | 
			
		||||
    /***************************************************************/
 | 
			
		||||
    /*
 | 
			
		||||
     Additional EOFA operators only called outside the inverter.
 | 
			
		||||
     Since speed is not essential, simple axpby-style
 | 
			
		||||
     implementations should be fine.
 | 
			
		||||
    */
 | 
			
		||||
    template<class Impl>
 | 
			
		||||
    void DomainWallEOFAFermion<Impl>::Omega(const FermionField& psi, FermionField& Din, int sign, int dag)
 | 
			
		||||
    {
 | 
			
		||||
@@ -115,9 +115,9 @@ namespace QCD {
 | 
			
		||||
        return(norm2(chi));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /********************************************************************
 | 
			
		||||
    /* Performance critical fermion operators called inside the inverter
 | 
			
		||||
    /********************************************************************/
 | 
			
		||||
    
 | 
			
		||||
    // Performance critical fermion operators called inside the inverter
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    template<class Impl>
 | 
			
		||||
    void DomainWallEOFAFermion<Impl>::M5D(const FermionField& psi, FermionField& chi)
 | 
			
		||||
 
 | 
			
		||||
@@ -77,11 +77,11 @@ namespace QCD {
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /***************************************************************
 | 
			
		||||
    /* Additional EOFA operators only called outside the inverter.
 | 
			
		||||
    /* Since speed is not essential, simple axpby-style
 | 
			
		||||
    /* implementations should be fine.
 | 
			
		||||
    /***************************************************************/
 | 
			
		||||
    /*
 | 
			
		||||
     Additional EOFA operators only called outside the inverter.
 | 
			
		||||
     Since speed is not essential, simple axpby-style
 | 
			
		||||
     implementations should be fine.
 | 
			
		||||
    */
 | 
			
		||||
    template<class Impl>
 | 
			
		||||
    void MobiusEOFAFermion<Impl>::Omega(const FermionField& psi, FermionField& Din, int sign, int dag)
 | 
			
		||||
    {
 | 
			
		||||
@@ -193,9 +193,9 @@ namespace QCD {
 | 
			
		||||
      return(norm2(chi));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /********************************************************************
 | 
			
		||||
    /* Performance critical fermion operators called inside the inverter
 | 
			
		||||
    /********************************************************************/
 | 
			
		||||
    
 | 
			
		||||
    // Performance critical fermion operators called inside the inverter
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    template<class Impl>
 | 
			
		||||
    void MobiusEOFAFermion<Impl>::M5D(const FermionField& psi, FermionField& chi)
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ namespace Grid{
 | 
			
		||||
    //         (Moe Moo)    (Moe Mee^-1    1 )   (0   Moo-Moe Mee^-1 Meo)  (0   1         )
 | 
			
		||||
    //
 | 
			
		||||
    // Determinant is det of middle factor
 | 
			
		||||
    // This assumes Mee is indept of U.
 | 
			
		||||
    // NOTICE: This assumes Mee is indept of U in computing the derivative
 | 
			
		||||
    //
 | 
			
		||||
    template<class Impl>
 | 
			
		||||
    class SchurDifferentiableOperator :  public SchurDiagMooeeOperator<FermionOperator<Impl>,typename Impl::FermionField> 
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										209
									
								
								lib/qcd/utils/CovariantAdjointLaplacian.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								lib/qcd/utils/CovariantAdjointLaplacian.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,209 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid
 | 
			
		||||
 | 
			
		||||
Source file: ./lib/qcd/action/scalar/CovariantAdjointLaplacian.h
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2016
 | 
			
		||||
 | 
			
		||||
Author: Guido Cossu <guido.cossu@ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License along
 | 
			
		||||
with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 | 
			
		||||
See the full license in the file "LICENSE" in the top level distribution
 | 
			
		||||
directory
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
 | 
			
		||||
#ifndef COVARIANT_ADJOINT_LAPLACIAN_H
 | 
			
		||||
#define COVARIANT_ADJOINT_LAPLACIAN_H
 | 
			
		||||
 | 
			
		||||
namespace Grid
 | 
			
		||||
{
 | 
			
		||||
namespace QCD
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
struct LaplacianParams : Serializable
 | 
			
		||||
{
 | 
			
		||||
  GRID_SERIALIZABLE_CLASS_MEMBERS(LaplacianParams,
 | 
			
		||||
                                  RealD, lo,
 | 
			
		||||
                                  RealD, hi,
 | 
			
		||||
                                  int, MaxIter,
 | 
			
		||||
                                  RealD, tolerance,
 | 
			
		||||
                                  int, degree,
 | 
			
		||||
                                  int, precision);
 | 
			
		||||
 | 
			
		||||
  // constructor
 | 
			
		||||
  LaplacianParams(RealD lo = 0.0,
 | 
			
		||||
                  RealD hi = 1.0,
 | 
			
		||||
                  int maxit = 1000,
 | 
			
		||||
                  RealD tol = 1.0e-8,
 | 
			
		||||
                  int degree = 10,
 | 
			
		||||
                  int precision = 64)
 | 
			
		||||
      : lo(lo),
 | 
			
		||||
        hi(hi),
 | 
			
		||||
        MaxIter(maxit),
 | 
			
		||||
        tolerance(tol),
 | 
			
		||||
        degree(degree),
 | 
			
		||||
        precision(precision){};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////
 | 
			
		||||
// Laplacian operator L on adjoint fields
 | 
			
		||||
//
 | 
			
		||||
// phi: adjoint field
 | 
			
		||||
// L: D_mu^dag D_mu
 | 
			
		||||
//
 | 
			
		||||
// L phi(x) = Sum_mu [ U_mu(x)phi(x+mu)U_mu(x)^dag +
 | 
			
		||||
//                     U_mu(x-mu)^dag phi(x-mu)U_mu(x-mu)
 | 
			
		||||
//                     -2phi(x)]
 | 
			
		||||
//
 | 
			
		||||
// Operator designed to be encapsulated by
 | 
			
		||||
// an HermitianLinearOperator<.. , ..>
 | 
			
		||||
////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
template <class Impl>
 | 
			
		||||
class LaplacianAdjointField : public Metric<typename Impl::Field>
 | 
			
		||||
{
 | 
			
		||||
  OperatorFunction<typename Impl::Field> &Solver;
 | 
			
		||||
  LaplacianParams param;
 | 
			
		||||
  MultiShiftFunction PowerHalf;
 | 
			
		||||
  MultiShiftFunction PowerInvHalf;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  INHERIT_GIMPL_TYPES(Impl);
 | 
			
		||||
 | 
			
		||||
  LaplacianAdjointField(GridBase *grid, OperatorFunction<GaugeField> &S, LaplacianParams &p, const RealD k = 1.0)
 | 
			
		||||
      : U(Nd, grid), Solver(S), param(p), kappa(k)
 | 
			
		||||
  {
 | 
			
		||||
    AlgRemez remez(param.lo, param.hi, param.precision);
 | 
			
		||||
    std::cout << GridLogMessage << "Generating degree " << param.degree << " for x^(1/2)" << std::endl;
 | 
			
		||||
    remez.generateApprox(param.degree, 1, 2);
 | 
			
		||||
    PowerHalf.Init(remez, param.tolerance, false);
 | 
			
		||||
    PowerInvHalf.Init(remez, param.tolerance, true);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  void Mdir(const GaugeField &, GaugeField &, int, int) { assert(0); }
 | 
			
		||||
  void Mdiag(const GaugeField &, GaugeField &) { assert(0); }
 | 
			
		||||
 | 
			
		||||
  void ImportGauge(const GaugeField &_U)
 | 
			
		||||
  {
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++)
 | 
			
		||||
    {
 | 
			
		||||
      U[mu] = PeekIndex<LorentzIndex>(_U, mu);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void M(const GaugeField &in, GaugeField &out)
 | 
			
		||||
  {
 | 
			
		||||
    // in is an antihermitian matrix
 | 
			
		||||
    // test
 | 
			
		||||
    //GaugeField herm = in + adj(in);
 | 
			
		||||
    //std::cout << "AHermiticity: " << norm2(herm) << std::endl;
 | 
			
		||||
 | 
			
		||||
    GaugeLinkField tmp(in._grid);
 | 
			
		||||
    GaugeLinkField tmp2(in._grid);
 | 
			
		||||
    GaugeLinkField sum(in._grid);
 | 
			
		||||
 | 
			
		||||
    for (int nu = 0; nu < Nd; nu++)
 | 
			
		||||
    {
 | 
			
		||||
      sum = zero;
 | 
			
		||||
      GaugeLinkField in_nu = PeekIndex<LorentzIndex>(in, nu);
 | 
			
		||||
      GaugeLinkField out_nu(out._grid);
 | 
			
		||||
      for (int mu = 0; mu < Nd; mu++)
 | 
			
		||||
      {
 | 
			
		||||
        tmp = U[mu] * Cshift(in_nu, mu, +1) * adj(U[mu]);
 | 
			
		||||
        tmp2 = adj(U[mu]) * in_nu * U[mu];
 | 
			
		||||
        sum += tmp + Cshift(tmp2, mu, -1) - 2.0 * in_nu;
 | 
			
		||||
      }
 | 
			
		||||
      out_nu = (1.0 - kappa) * in_nu - kappa / (double(4 * Nd)) * sum;
 | 
			
		||||
      PokeIndex<LorentzIndex>(out, out_nu, nu);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void MDeriv(const GaugeField &in, GaugeField &der)
 | 
			
		||||
  {
 | 
			
		||||
    // in is anti-hermitian
 | 
			
		||||
    RealD factor = -kappa / (double(4 * Nd));
 | 
			
		||||
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++)
 | 
			
		||||
    {
 | 
			
		||||
      GaugeLinkField der_mu(der._grid);
 | 
			
		||||
      der_mu = zero;
 | 
			
		||||
      for (int nu = 0; nu < Nd; nu++)
 | 
			
		||||
      {
 | 
			
		||||
        GaugeLinkField in_nu = PeekIndex<LorentzIndex>(in, nu);
 | 
			
		||||
        der_mu += U[mu] * Cshift(in_nu, mu, 1) * adj(U[mu]) * in_nu;
 | 
			
		||||
      }
 | 
			
		||||
      // the minus sign comes by using the in_nu instead of the
 | 
			
		||||
      // adjoint in the last multiplication
 | 
			
		||||
      PokeIndex<LorentzIndex>(der, -2.0 * factor * der_mu, mu);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // separating this temporarily
 | 
			
		||||
  void MDeriv(const GaugeField &left, const GaugeField &right,
 | 
			
		||||
              GaugeField &der)
 | 
			
		||||
  {
 | 
			
		||||
    // in is anti-hermitian
 | 
			
		||||
    RealD factor = -kappa / (double(4 * Nd));
 | 
			
		||||
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++)
 | 
			
		||||
    {
 | 
			
		||||
      GaugeLinkField der_mu(der._grid);
 | 
			
		||||
      der_mu = zero;
 | 
			
		||||
      for (int nu = 0; nu < Nd; nu++)
 | 
			
		||||
      {
 | 
			
		||||
        GaugeLinkField left_nu = PeekIndex<LorentzIndex>(left, nu);
 | 
			
		||||
        GaugeLinkField right_nu = PeekIndex<LorentzIndex>(right, nu);
 | 
			
		||||
        der_mu += U[mu] * Cshift(left_nu, mu, 1) * adj(U[mu]) * right_nu;
 | 
			
		||||
        der_mu += U[mu] * Cshift(right_nu, mu, 1) * adj(U[mu]) * left_nu;
 | 
			
		||||
      }
 | 
			
		||||
      PokeIndex<LorentzIndex>(der, -factor * der_mu, mu);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void Minv(const GaugeField &in, GaugeField &inverted)
 | 
			
		||||
  {
 | 
			
		||||
    HermitianLinearOperator<LaplacianAdjointField<Impl>, GaugeField> HermOp(*this);
 | 
			
		||||
    Solver(HermOp, in, inverted);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void MSquareRoot(GaugeField &P)
 | 
			
		||||
  {
 | 
			
		||||
    GaugeField Gp(P._grid);
 | 
			
		||||
    HermitianLinearOperator<LaplacianAdjointField<Impl>, GaugeField> HermOp(*this);
 | 
			
		||||
    ConjugateGradientMultiShift<GaugeField> msCG(param.MaxIter, PowerHalf);
 | 
			
		||||
    msCG(HermOp, P, Gp);
 | 
			
		||||
    P = Gp;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void MInvSquareRoot(GaugeField &P)
 | 
			
		||||
  {
 | 
			
		||||
    GaugeField Gp(P._grid);
 | 
			
		||||
    HermitianLinearOperator<LaplacianAdjointField<Impl>, GaugeField> HermOp(*this);
 | 
			
		||||
    ConjugateGradientMultiShift<GaugeField> msCG(param.MaxIter, PowerInvHalf);
 | 
			
		||||
    msCG(HermOp, P, Gp);
 | 
			
		||||
    P = Gp;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  RealD kappa;
 | 
			
		||||
  std::vector<GaugeLinkField> U;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // QCD
 | 
			
		||||
} // Grid
 | 
			
		||||
#endif
 | 
			
		||||
@@ -4,7 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
 | 
			
		||||
 | 
			
		||||
Source file: ./lib/qcd/action/scalar/CovariantLaplacian.h
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2016
 | 
			
		||||
Copyright (C) 2017
 | 
			
		||||
 | 
			
		||||
Author: Guido Cossu <guido.cossu@ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
@@ -30,168 +30,57 @@ directory
 | 
			
		||||
#ifndef COVARIANT_LAPLACIAN_H
 | 
			
		||||
#define COVARIANT_LAPLACIAN_H
 | 
			
		||||
 | 
			
		||||
namespace Grid {
 | 
			
		||||
namespace QCD {
 | 
			
		||||
 | 
			
		||||
struct LaplacianParams : Serializable {
 | 
			
		||||
  GRID_SERIALIZABLE_CLASS_MEMBERS(LaplacianParams, 
 | 
			
		||||
                                  RealD, lo, 
 | 
			
		||||
                                  RealD, hi, 
 | 
			
		||||
                                  int,   MaxIter, 
 | 
			
		||||
                                  RealD, tolerance, 
 | 
			
		||||
                                  int,   degree, 
 | 
			
		||||
                                  int,   precision);
 | 
			
		||||
  
 | 
			
		||||
  // constructor 
 | 
			
		||||
  LaplacianParams(RealD lo      = 0.0, 
 | 
			
		||||
                  RealD hi      = 1.0, 
 | 
			
		||||
                  int maxit     = 1000,
 | 
			
		||||
                  RealD tol     = 1.0e-8, 
 | 
			
		||||
                  int degree    = 10,
 | 
			
		||||
                  int precision = 64)
 | 
			
		||||
    : lo(lo),
 | 
			
		||||
      hi(hi),
 | 
			
		||||
      MaxIter(maxit),
 | 
			
		||||
      tolerance(tol),
 | 
			
		||||
      degree(degree),
 | 
			
		||||
      precision(precision){};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace Grid
 | 
			
		||||
{
 | 
			
		||||
namespace QCD
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////
 | 
			
		||||
// Laplacian operator L on adjoint fields
 | 
			
		||||
// Laplacian operator L on fermion fields
 | 
			
		||||
//
 | 
			
		||||
// phi: adjoint field
 | 
			
		||||
// L: D_mu^dag D_mu
 | 
			
		||||
// phi: fermion field
 | 
			
		||||
//
 | 
			
		||||
// L phi(x) = Sum_mu [ U_mu(x)phi(x+mu)U_mu(x)^dag + 
 | 
			
		||||
//                     U_mu(x-mu)^dag phi(x-mu)U_mu(x-mu)
 | 
			
		||||
//                     -2phi(x)]
 | 
			
		||||
// L phi(x) = Sum_mu [ U_mu(x) phi(x+mu) + U_mu(x-mu) phi(x-mu) - 2phi(x)]
 | 
			
		||||
//
 | 
			
		||||
// Operator designed to be encapsulated by
 | 
			
		||||
// an HermitianLinearOperator<.. , ..>
 | 
			
		||||
////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
// has to inherit from a fermion implementation
 | 
			
		||||
template <class Impl>
 | 
			
		||||
class LaplacianAdjointField: public Metric<typename Impl::Field> {
 | 
			
		||||
  OperatorFunction<typename Impl::Field> &Solver;
 | 
			
		||||
  LaplacianParams param;
 | 
			
		||||
  MultiShiftFunction PowerHalf;    
 | 
			
		||||
  MultiShiftFunction PowerInvHalf;    
 | 
			
		||||
class Laplacian
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  INHERIT_IMPL_TYPES(Impl);
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  INHERIT_GIMPL_TYPES(Impl);
 | 
			
		||||
  // add a bool to smear only in the spatial directions
 | 
			
		||||
  Laplacian(GridBase *grid, bool spatial = false)
 | 
			
		||||
      : U(Nd, grid), spatial_laplacian(spatial){};
 | 
			
		||||
 | 
			
		||||
  LaplacianAdjointField(GridBase* grid, OperatorFunction<GaugeField>& S, LaplacianParams& p, const RealD k = 1.0)
 | 
			
		||||
      : U(Nd, grid), Solver(S), param(p), kappa(k){
 | 
			
		||||
        AlgRemez remez(param.lo,param.hi,param.precision);
 | 
			
		||||
        std::cout<<GridLogMessage << "Generating degree "<<param.degree<<" for x^(1/2)"<<std::endl;
 | 
			
		||||
        remez.generateApprox(param.degree,1,2);
 | 
			
		||||
        PowerHalf.Init(remez,param.tolerance,false);
 | 
			
		||||
        PowerInvHalf.Init(remez,param.tolerance,true);
 | 
			
		||||
  void Mdir(const FermionField &, FermionField &, int, int) { assert(0); }
 | 
			
		||||
  void Mdiag(const FermionField &, FermionField &) { assert(0); }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
  void Mdir(const GaugeField&, GaugeField&, int, int){ assert(0);}
 | 
			
		||||
  void Mdiag(const GaugeField&, GaugeField&){ assert(0);}
 | 
			
		||||
 | 
			
		||||
  void ImportGauge(const GaugeField& _U) {
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++) {
 | 
			
		||||
  void ImportGauge(const GaugeField &_U)
 | 
			
		||||
  {
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++)
 | 
			
		||||
      U[mu] = PeekIndex<LorentzIndex>(_U, mu);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void M(const FermionField &in, FermionField &out)
 | 
			
		||||
  {
 | 
			
		||||
    int dims = spatial_laplacian ? (Nd - 1) : Nd;
 | 
			
		||||
 | 
			
		||||
    out = -2.0 * dims * in;
 | 
			
		||||
    // eventually speed up with the stencil operator, if necessary
 | 
			
		||||
    for (int mu = 0; mu < dims; mu++)
 | 
			
		||||
      out += Impl::CovShiftForward(U[mu], mu, in) + Impl::CovShiftBackward(U[mu], mu, in);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void M(const GaugeField& in, GaugeField& out) {
 | 
			
		||||
    // in is an antihermitian matrix
 | 
			
		||||
    // test
 | 
			
		||||
    //GaugeField herm = in + adj(in);
 | 
			
		||||
    //std::cout << "AHermiticity: " << norm2(herm) << std::endl;
 | 
			
		||||
 | 
			
		||||
    GaugeLinkField tmp(in._grid);
 | 
			
		||||
    GaugeLinkField tmp2(in._grid);
 | 
			
		||||
    GaugeLinkField sum(in._grid);
 | 
			
		||||
 | 
			
		||||
    for (int nu = 0; nu < Nd; nu++) {
 | 
			
		||||
      sum = zero;
 | 
			
		||||
      GaugeLinkField in_nu = PeekIndex<LorentzIndex>(in, nu);
 | 
			
		||||
      GaugeLinkField out_nu(out._grid);
 | 
			
		||||
      for (int mu = 0; mu < Nd; mu++) {
 | 
			
		||||
        tmp = U[mu] * Cshift(in_nu, mu, +1) * adj(U[mu]);
 | 
			
		||||
        tmp2 = adj(U[mu]) * in_nu * U[mu];
 | 
			
		||||
        sum += tmp + Cshift(tmp2, mu, -1) - 2.0 * in_nu;
 | 
			
		||||
      }
 | 
			
		||||
      out_nu = (1.0 - kappa) * in_nu - kappa / (double(4 * Nd)) * sum;
 | 
			
		||||
      PokeIndex<LorentzIndex>(out, out_nu, nu);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void MDeriv(const GaugeField& in, GaugeField& der) {
 | 
			
		||||
    // in is anti-hermitian
 | 
			
		||||
    RealD factor = -kappa / (double(4 * Nd));
 | 
			
		||||
    
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++){
 | 
			
		||||
      GaugeLinkField der_mu(der._grid);
 | 
			
		||||
      der_mu = zero;
 | 
			
		||||
      for (int nu = 0; nu < Nd; nu++){
 | 
			
		||||
        GaugeLinkField in_nu = PeekIndex<LorentzIndex>(in, nu);
 | 
			
		||||
        der_mu += U[mu] * Cshift(in_nu, mu, 1) * adj(U[mu]) * in_nu;
 | 
			
		||||
      }
 | 
			
		||||
      // the minus sign comes by using the in_nu instead of the
 | 
			
		||||
      // adjoint in the last multiplication
 | 
			
		||||
      PokeIndex<LorentzIndex>(der,  -2.0 * factor * der_mu, mu);
 | 
			
		||||
    } 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // separating this temporarily
 | 
			
		||||
  void MDeriv(const GaugeField& left, const GaugeField& right,
 | 
			
		||||
              GaugeField& der) {
 | 
			
		||||
    // in is anti-hermitian
 | 
			
		||||
    RealD factor = -kappa / (double(4 * Nd));
 | 
			
		||||
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++) {
 | 
			
		||||
      GaugeLinkField der_mu(der._grid);
 | 
			
		||||
      der_mu = zero;
 | 
			
		||||
      for (int nu = 0; nu < Nd; nu++) {
 | 
			
		||||
        GaugeLinkField left_nu = PeekIndex<LorentzIndex>(left, nu);
 | 
			
		||||
        GaugeLinkField right_nu = PeekIndex<LorentzIndex>(right, nu);
 | 
			
		||||
        der_mu += U[mu] * Cshift(left_nu, mu, 1) * adj(U[mu]) * right_nu;
 | 
			
		||||
        der_mu += U[mu] * Cshift(right_nu, mu, 1) * adj(U[mu]) * left_nu;
 | 
			
		||||
      }
 | 
			
		||||
      PokeIndex<LorentzIndex>(der, -factor * der_mu, mu);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void Minv(const GaugeField& in, GaugeField& inverted){
 | 
			
		||||
    HermitianLinearOperator<LaplacianAdjointField<Impl>,GaugeField> HermOp(*this);
 | 
			
		||||
    Solver(HermOp, in, inverted);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void MSquareRoot(GaugeField& P){
 | 
			
		||||
    GaugeField Gp(P._grid);
 | 
			
		||||
    HermitianLinearOperator<LaplacianAdjointField<Impl>,GaugeField> HermOp(*this);
 | 
			
		||||
    ConjugateGradientMultiShift<GaugeField> msCG(param.MaxIter,PowerHalf);
 | 
			
		||||
    msCG(HermOp,P,Gp);
 | 
			
		||||
    P = Gp; 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void MInvSquareRoot(GaugeField& P){
 | 
			
		||||
    GaugeField Gp(P._grid);
 | 
			
		||||
    HermitianLinearOperator<LaplacianAdjointField<Impl>,GaugeField> HermOp(*this);
 | 
			
		||||
    ConjugateGradientMultiShift<GaugeField> msCG(param.MaxIter,PowerInvHalf);
 | 
			
		||||
    msCG(HermOp,P,Gp);
 | 
			
		||||
    P = Gp; 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  RealD kappa;
 | 
			
		||||
private:
 | 
			
		||||
  bool spatial_laplacian;
 | 
			
		||||
  std::vector<GaugeLinkField> U;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
}; // Laplacian
 | 
			
		||||
 | 
			
		||||
} // QCD
 | 
			
		||||
} // Grid
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										105
									
								
								tests/core/Test_laplacian.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								tests/core/Test_laplacian.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,105 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid
 | 
			
		||||
 | 
			
		||||
    Source file: ./tests/Test_laplacian.cc
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2017
 | 
			
		||||
 | 
			
		||||
Author: Guido Cossu <guido.cossu@ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 | 
			
		||||
    See the full license in the file "LICENSE" in the top level distribution directory
 | 
			
		||||
    *************************************************************************************/
 | 
			
		||||
    /*  END LEGAL */
 | 
			
		||||
#include <Grid/Grid.h>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Grid::QCD;
 | 
			
		||||
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
 | 
			
		||||
  std::vector<int> latt_size   = GridDefaultLatt();
 | 
			
		||||
  std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd());
 | 
			
		||||
  std::vector<int> mpi_layout  = GridDefaultMpi();
 | 
			
		||||
  GridCartesian               Grid(latt_size,simd_layout,mpi_layout);
 | 
			
		||||
  GridRedBlackCartesian     RBGrid(&Grid);
 | 
			
		||||
 | 
			
		||||
  int threads = GridThread::GetThreads();
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl;
 | 
			
		||||
 | 
			
		||||
  GridParallelRNG          pRNG(&Grid);
 | 
			
		||||
  pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  std::vector<int> point({0,0,0,0});
 | 
			
		||||
 | 
			
		||||
  LatticeFermion src   (&Grid); //random(pRNG,src);
 | 
			
		||||
  SpinColourVectorD Sp;
 | 
			
		||||
  for (unsigned int s = 0; s < Ns; ++s)
 | 
			
		||||
      for (unsigned int c = 0; c < Nc; ++c)
 | 
			
		||||
        Sp()(s)(c) = 1;
 | 
			
		||||
 | 
			
		||||
  src = zero;
 | 
			
		||||
  pokeSite(Sp,src,point);
 | 
			
		||||
 | 
			
		||||
  LatticeFermion result(&Grid); result=zero;
 | 
			
		||||
  LatticeFermion tmp(&Grid); tmp=zero;
 | 
			
		||||
 | 
			
		||||
  // Gauge configuration
 | 
			
		||||
  LatticeGaugeField Umu(&Grid); SU3::HotConfiguration(pRNG,Umu);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Testing the laplacian operator on a point source            "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  Laplacian<WilsonImplR> LaplaceOperator(src._grid);
 | 
			
		||||
  LaplaceOperator.ImportGauge(Umu);
 | 
			
		||||
  LaplaceOperator.M(src, result);
 | 
			
		||||
 | 
			
		||||
  std::cout << "Source vector" << std::endl;
 | 
			
		||||
  std::cout << src << std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout << "Result vector" << std::endl;
 | 
			
		||||
  std::cout << result << std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Testing the laplacian smearing operator on a point source   "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  LatticeFermion smeared  (&Grid); smeared = src;
 | 
			
		||||
  for (int smr = 0; smr < 10; ++smr)
 | 
			
		||||
  {
 | 
			
		||||
      LaplaceOperator.M(smeared, tmp);
 | 
			
		||||
      smeared += 0.1*tmp;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  std::cout << "Smeared vector" << std::endl;
 | 
			
		||||
  std::cout << smeared << std::endl;
 | 
			
		||||
 | 
			
		||||
  // Norm of vector
 | 
			
		||||
  LatticeComplex smr_norm(&Grid);
 | 
			
		||||
  smr_norm = localNorm2(smeared);
 | 
			
		||||
  std::cout << "Smeared vector norm" << std::endl;
 | 
			
		||||
  std::cout << smr_norm << std::endl;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										195
									
								
								tests/hadrons/Test_hadrons_meson_3pt_laplacian.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								tests/hadrons/Test_hadrons_meson_3pt_laplacian.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,195 @@
 | 
			
		||||
/*******************************************************************************
 | 
			
		||||
 Grid physics library, www.github.com/paboyle/Grid
 | 
			
		||||
 
 | 
			
		||||
 Source file: tests/hadrons/Test_hadrons_meson_3pt.cc
 | 
			
		||||
 
 | 
			
		||||
 Copyright (C) 2015
 | 
			
		||||
 
 | 
			
		||||
 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.
 | 
			
		||||
 *******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <Grid/Hadrons/Application.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 = {"l", "s", "c1", "c2", "c3"};
 | 
			
		||||
    std::vector<double>      mass    = {.01, .04, .2  , .25 , .3  };
 | 
			
		||||
    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";
 | 
			
		||||
    globalPar.genetic.maxGen       = 1000;
 | 
			
		||||
    globalPar.genetic.maxCstGen    = 200;
 | 
			
		||||
    globalPar.genetic.popSize      = 20;
 | 
			
		||||
    globalPar.genetic.mutationRate = .1;
 | 
			
		||||
    application.setPar(globalPar);
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    // gauge field
 | 
			
		||||
    application.createModule<MGauge::Unit>("gauge");
 | 
			
		||||
    
 | 
			
		||||
    // set fermion boundary conditions to be periodic space, antiperiodic time.
 | 
			
		||||
    std::string boundary = "1 1 1 -1";
 | 
			
		||||
 | 
			
		||||
    // sink
 | 
			
		||||
    MSink::Point::Par sinkPar;
 | 
			
		||||
    sinkPar.mom = "0 0 0";
 | 
			
		||||
    application.createModule<MSink::ScalarPoint>("sink", sinkPar);
 | 
			
		||||
    for (unsigned int i = 0; i < flavour.size(); ++i)
 | 
			
		||||
    {
 | 
			
		||||
        // actions
 | 
			
		||||
        MAction::DWF::Par actionPar;
 | 
			
		||||
        actionPar.gauge = "gauge";
 | 
			
		||||
        actionPar.Ls    = 12;
 | 
			
		||||
        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;
 | 
			
		||||
        application.createModule<MSolver::RBPrecCG>("CG_" + flavour[i],
 | 
			
		||||
                                                    solverPar);
 | 
			
		||||
    }
 | 
			
		||||
    for (unsigned int t = 0; t < nt; t += 1)
 | 
			
		||||
    {
 | 
			
		||||
        std::string                           srcName;
 | 
			
		||||
        std::string                           lapName;
 | 
			
		||||
        std::vector<std::string>              qName;
 | 
			
		||||
        std::vector<std::vector<std::string>> seqName;
 | 
			
		||||
        
 | 
			
		||||
        // Z2 source
 | 
			
		||||
        MSource::Z2::Par z2Par;
 | 
			
		||||
        z2Par.tA = t;
 | 
			
		||||
        z2Par.tB = t;
 | 
			
		||||
        srcName  = "z2_" + std::to_string(t);
 | 
			
		||||
        application.createModule<MSource::Z2>(srcName, z2Par);
 | 
			
		||||
 | 
			
		||||
        // Example of smearing of the source 
 | 
			
		||||
        MSource::LaplaceSmearing::Par LapPar;
 | 
			
		||||
        LapPar.N = 10;
 | 
			
		||||
        LapPar.alpha = 0.1;
 | 
			
		||||
        LapPar.source = srcName;
 | 
			
		||||
        LapPar.gauge = "gauge";
 | 
			
		||||
        lapName = "z2smr_" + std::to_string(t);
 | 
			
		||||
        application.createModule<MSource::LaplaceSmearing>(lapName, LapPar);
 | 
			
		||||
 | 
			
		||||
        for (unsigned int i = 0; i < flavour.size(); ++i)
 | 
			
		||||
        {
 | 
			
		||||
            // sequential sources
 | 
			
		||||
            MSource::SeqGamma::Par seqPar;
 | 
			
		||||
            qName.push_back("QZ2_" + flavour[i] + "_" + std::to_string(t));
 | 
			
		||||
            seqPar.q   = qName[i];
 | 
			
		||||
            seqPar.tA  = (t + nt/4) % nt;
 | 
			
		||||
            seqPar.tB  = (t + nt/4) % nt;
 | 
			
		||||
            seqPar.mom = "1. 0. 0. 0.";
 | 
			
		||||
            seqName.push_back(std::vector<std::string>(Nd));
 | 
			
		||||
            for (unsigned int mu = 0; mu < Nd; ++mu)
 | 
			
		||||
            {
 | 
			
		||||
                seqPar.gamma   = 0x1 << mu;
 | 
			
		||||
                seqName[i][mu] = "G" + std::to_string(seqPar.gamma)
 | 
			
		||||
                                 + "_" + std::to_string(seqPar.tA) + "-"
 | 
			
		||||
                                 + qName[i];
 | 
			
		||||
                application.createModule<MSource::SeqGamma>(seqName[i][mu], seqPar);
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            // propagators
 | 
			
		||||
            MFermion::GaugeProp::Par quarkPar;
 | 
			
		||||
            quarkPar.solver = "CG_" + flavour[i];
 | 
			
		||||
            quarkPar.source = srcName;
 | 
			
		||||
            application.createModule<MFermion::GaugeProp>(qName[i], quarkPar);
 | 
			
		||||
            for (unsigned int mu = 0; mu < Nd; ++mu)
 | 
			
		||||
            {
 | 
			
		||||
                quarkPar.source = seqName[i][mu];
 | 
			
		||||
                seqName[i][mu]  = "Q_" + flavour[i] + "-" + seqName[i][mu];
 | 
			
		||||
                application.createModule<MFermion::GaugeProp>(seqName[i][mu], quarkPar);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // contractions
 | 
			
		||||
        MContraction::Meson::Par mesPar;
 | 
			
		||||
        for (unsigned int i = 0; i < flavour.size(); ++i)
 | 
			
		||||
        for (unsigned int j = i; j < flavour.size(); ++j)
 | 
			
		||||
        {
 | 
			
		||||
            mesPar.output = "mesons/Z2_" + flavour[i] + flavour[j];
 | 
			
		||||
            mesPar.q1     = qName[i];
 | 
			
		||||
            mesPar.q2     = qName[j];
 | 
			
		||||
            mesPar.gammas = "all";
 | 
			
		||||
            mesPar.sink   = "sink";
 | 
			
		||||
            application.createModule<MContraction::Meson>("meson_Z2_"
 | 
			
		||||
                                                          + std::to_string(t)
 | 
			
		||||
                                                          + "_"
 | 
			
		||||
                                                          + flavour[i]
 | 
			
		||||
                                                          + flavour[j],
 | 
			
		||||
                                                          mesPar);
 | 
			
		||||
        }
 | 
			
		||||
        for (unsigned int i = 0; i < flavour.size(); ++i)
 | 
			
		||||
        for (unsigned int j = 0; j < flavour.size(); ++j)
 | 
			
		||||
        for (unsigned int mu = 0; mu < Nd; ++mu)
 | 
			
		||||
        {
 | 
			
		||||
            MContraction::Meson::Par mesPar;
 | 
			
		||||
            
 | 
			
		||||
            mesPar.output = "3pt/Z2_" + flavour[i] + flavour[j] + "_"
 | 
			
		||||
                            + std::to_string(mu);
 | 
			
		||||
            mesPar.q1     = qName[i];
 | 
			
		||||
            mesPar.q2     = seqName[j][mu];
 | 
			
		||||
            mesPar.gammas = "all";
 | 
			
		||||
            mesPar.sink   = "sink";
 | 
			
		||||
            application.createModule<MContraction::Meson>("3pt_Z2_"
 | 
			
		||||
                                                          + std::to_string(t)
 | 
			
		||||
                                                          + "_"
 | 
			
		||||
                                                          + flavour[i]
 | 
			
		||||
                                                          + flavour[j]
 | 
			
		||||
                                                          + "_"
 | 
			
		||||
                                                          + std::to_string(mu),
 | 
			
		||||
                                                          mesPar);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // execution
 | 
			
		||||
    application.saveParameterFile("meson3pt.xml");
 | 
			
		||||
    application.run();
 | 
			
		||||
    
 | 
			
		||||
    // epilogue
 | 
			
		||||
    LOG(Message) << "Grid is finalizing now" << std::endl;
 | 
			
		||||
    Grid_finalize();
 | 
			
		||||
    
 | 
			
		||||
    return EXIT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user