mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-10 07:55:35 +00:00
Merge remote-tracking branch 'upstream/develop' into feature/ddalphaamg
This commit is contained in:
commit
a414430817
6
.gitignore
vendored
6
.gitignore
vendored
@ -123,3 +123,9 @@ make-bin-BUCK.sh
|
|||||||
#####################
|
#####################
|
||||||
lib/qcd/spin/gamma-gen/*.h
|
lib/qcd/spin/gamma-gen/*.h
|
||||||
lib/qcd/spin/gamma-gen/*.cc
|
lib/qcd/spin/gamma-gen/*.cc
|
||||||
|
|
||||||
|
# vs code editor files #
|
||||||
|
########################
|
||||||
|
.vscode/
|
||||||
|
.vscode/settings.json
|
||||||
|
settings.json
|
||||||
|
@ -44,3 +44,4 @@ script:
|
|||||||
- make -j4
|
- make -j4
|
||||||
- ./benchmarks/Benchmark_dwf --threads 1 --debug-signals
|
- ./benchmarks/Benchmark_dwf --threads 1 --debug-signals
|
||||||
- make check
|
- make check
|
||||||
|
|
||||||
|
@ -48,7 +48,6 @@ int main (int argc, char ** argv)
|
|||||||
|
|
||||||
|
|
||||||
int threads = GridThread::GetThreads();
|
int threads = GridThread::GetThreads();
|
||||||
std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl;
|
|
||||||
|
|
||||||
std::vector<int> latt4 = GridDefaultLatt();
|
std::vector<int> latt4 = GridDefaultLatt();
|
||||||
int Ls=16;
|
int Ls=16;
|
||||||
@ -57,6 +56,10 @@ int main (int argc, char ** argv)
|
|||||||
std::stringstream ss(argv[i+1]); ss >> Ls;
|
std::stringstream ss(argv[i+1]); ss >> Ls;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GridLogLayout();
|
||||||
|
|
||||||
|
long unsigned int single_site_flops = 8*QCD::Nc*(7+16*QCD::Nc);
|
||||||
|
|
||||||
|
|
||||||
GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
|
GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
|
||||||
GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
|
GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
|
||||||
@ -187,7 +190,7 @@ int main (int argc, char ** argv)
|
|||||||
FGrid->Barrier();
|
FGrid->Barrier();
|
||||||
|
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=1344*volume*ncall;
|
double flops=single_site_flops*volume*ncall;
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "Called Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
std::cout<<GridLogMessage << "Called Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
||||||
// std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl;
|
// std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl;
|
||||||
@ -226,7 +229,7 @@ int main (int argc, char ** argv)
|
|||||||
FGrid->Barrier();
|
FGrid->Barrier();
|
||||||
|
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=1344*volume*ncall;
|
double flops=single_site_flops*volume*ncall;
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "Called half prec comms Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
std::cout<<GridLogMessage << "Called half prec comms Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
||||||
std::cout<<GridLogMessage << "mflop/s = "<< flops/(t1-t0)<<std::endl;
|
std::cout<<GridLogMessage << "mflop/s = "<< flops/(t1-t0)<<std::endl;
|
||||||
@ -277,7 +280,7 @@ int main (int argc, char ** argv)
|
|||||||
double t1=usecond();
|
double t1=usecond();
|
||||||
FGrid->Barrier();
|
FGrid->Barrier();
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=1344*volume*ncall;
|
double flops=single_site_flops*volume*ncall;
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "Called Dw s_inner "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
std::cout<<GridLogMessage << "Called Dw s_inner "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
||||||
std::cout<<GridLogMessage << "mflop/s = "<< flops/(t1-t0)<<std::endl;
|
std::cout<<GridLogMessage << "mflop/s = "<< flops/(t1-t0)<<std::endl;
|
||||||
@ -355,7 +358,7 @@ int main (int argc, char ** argv)
|
|||||||
// sDw.stat.print();
|
// sDw.stat.print();
|
||||||
|
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=(1344.0*volume*ncall)/2;
|
double flops=(single_site_flops*volume*ncall)/2.0;
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "sDeo mflop/s = "<< flops/(t1-t0)<<std::endl;
|
std::cout<<GridLogMessage << "sDeo mflop/s = "<< flops/(t1-t0)<<std::endl;
|
||||||
std::cout<<GridLogMessage << "sDeo mflop/s per rank "<< flops/(t1-t0)/NP<<std::endl;
|
std::cout<<GridLogMessage << "sDeo mflop/s per rank "<< flops/(t1-t0)/NP<<std::endl;
|
||||||
@ -478,7 +481,7 @@ int main (int argc, char ** argv)
|
|||||||
FGrid->Barrier();
|
FGrid->Barrier();
|
||||||
|
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=(1344.0*volume*ncall)/2;
|
double flops=(single_site_flops*volume*ncall)/2.0;
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "Deo mflop/s = "<< flops/(t1-t0)<<std::endl;
|
std::cout<<GridLogMessage << "Deo mflop/s = "<< flops/(t1-t0)<<std::endl;
|
||||||
std::cout<<GridLogMessage << "Deo mflop/s per rank "<< flops/(t1-t0)/NP<<std::endl;
|
std::cout<<GridLogMessage << "Deo mflop/s per rank "<< flops/(t1-t0)/NP<<std::endl;
|
||||||
|
@ -51,6 +51,7 @@ int main (int argc, char ** argv)
|
|||||||
{
|
{
|
||||||
Grid_init(&argc,&argv);
|
Grid_init(&argc,&argv);
|
||||||
|
|
||||||
|
|
||||||
std::cout << GridLogMessage<< "*****************************************************************" <<std::endl;
|
std::cout << GridLogMessage<< "*****************************************************************" <<std::endl;
|
||||||
std::cout << GridLogMessage<< "* Kernel options --dslash-generic, --dslash-unroll, --dslash-asm" <<std::endl;
|
std::cout << GridLogMessage<< "* Kernel options --dslash-generic, --dslash-unroll, --dslash-asm" <<std::endl;
|
||||||
std::cout << GridLogMessage<< "*****************************************************************" <<std::endl;
|
std::cout << GridLogMessage<< "*****************************************************************" <<std::endl;
|
||||||
@ -107,6 +108,7 @@ void benchDw(std::vector<int> & latt4, int Ls, int threads,int report )
|
|||||||
GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
|
GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
|
||||||
GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
|
GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
|
||||||
GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
|
GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
|
||||||
|
long unsigned int single_site_flops = 8*QCD::Nc*(7+16*QCD::Nc);
|
||||||
|
|
||||||
std::vector<int> seeds4({1,2,3,4});
|
std::vector<int> seeds4({1,2,3,4});
|
||||||
std::vector<int> seeds5({5,6,7,8});
|
std::vector<int> seeds5({5,6,7,8});
|
||||||
@ -196,7 +198,7 @@ void benchDw(std::vector<int> & latt4, int Ls, int threads,int report )
|
|||||||
|
|
||||||
if ( ! report ) {
|
if ( ! report ) {
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=1344*volume*ncall;
|
double flops=single_site_flops*volume*ncall;
|
||||||
std::cout <<"\t"<<NP<< "\t"<<flops/(t1-t0)<< "\t";
|
std::cout <<"\t"<<NP<< "\t"<<flops/(t1-t0)<< "\t";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,7 +230,7 @@ void benchDw(std::vector<int> & latt4, int Ls, int threads,int report )
|
|||||||
|
|
||||||
if(!report){
|
if(!report){
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=(1344.0*volume*ncall)/2;
|
double flops=(single_site_flops*volume*ncall)/2.0;
|
||||||
std::cout<< flops/(t1-t0);
|
std::cout<< flops/(t1-t0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -237,6 +239,7 @@ void benchDw(std::vector<int> & latt4, int Ls, int threads,int report )
|
|||||||
#define CHECK_SDW
|
#define CHECK_SDW
|
||||||
void benchsDw(std::vector<int> & latt4, int Ls, int threads, int report )
|
void benchsDw(std::vector<int> & latt4, int Ls, int threads, int report )
|
||||||
{
|
{
|
||||||
|
long unsigned int single_site_flops = 8*QCD::Nc*(7+16*QCD::Nc);
|
||||||
|
|
||||||
GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(latt4, GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
|
GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(latt4, GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
|
||||||
GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
|
GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
|
||||||
@ -321,7 +324,7 @@ void benchsDw(std::vector<int> & latt4, int Ls, int threads, int report )
|
|||||||
Counter.Report();
|
Counter.Report();
|
||||||
} else {
|
} else {
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=1344*volume*ncall;
|
double flops=single_site_flops*volume*ncall;
|
||||||
std::cout<<"\t"<< flops/(t1-t0);
|
std::cout<<"\t"<< flops/(t1-t0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,7 +361,7 @@ void benchsDw(std::vector<int> & latt4, int Ls, int threads, int report )
|
|||||||
CounterSdw.Report();
|
CounterSdw.Report();
|
||||||
} else {
|
} else {
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=(1344.0*volume*ncall)/2;
|
double flops=(single_site_flops*volume*ncall)/2.0;
|
||||||
std::cout<<"\t"<< flops/(t1-t0);
|
std::cout<<"\t"<< flops/(t1-t0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -107,7 +107,7 @@ int main (int argc, char ** argv)
|
|||||||
FGrid->Barrier();
|
FGrid->Barrier();
|
||||||
|
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=2*1344*volume*ncall;
|
double flops=2*1320*volume*ncall;
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "Called Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
std::cout<<GridLogMessage << "Called Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
||||||
// std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl;
|
// std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl;
|
||||||
@ -134,7 +134,7 @@ int main (int argc, char ** argv)
|
|||||||
FGrid->Barrier();
|
FGrid->Barrier();
|
||||||
|
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=2*1344*volume*ncall;
|
double flops=2*1320*volume*ncall;
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "Called half prec comms Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
std::cout<<GridLogMessage << "Called half prec comms Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
||||||
std::cout<<GridLogMessage << "mflop/s = "<< flops/(t1-t0)<<std::endl;
|
std::cout<<GridLogMessage << "mflop/s = "<< flops/(t1-t0)<<std::endl;
|
||||||
@ -174,7 +174,7 @@ int main (int argc, char ** argv)
|
|||||||
FGrid_d->Barrier();
|
FGrid_d->Barrier();
|
||||||
|
|
||||||
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
double volume=Ls; for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu];
|
||||||
double flops=2*1344*volume*ncall;
|
double flops=2*1320*volume*ncall;
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "Called Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
std::cout<<GridLogMessage << "Called Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl;
|
||||||
// std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl;
|
// std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl;
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Source file: ./benchmarks/Benchmark_wilson.cc
|
Source file: ./benchmarks/Benchmark_wilson.cc
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2018
|
||||||
|
|
||||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
||||||
Author: paboyle <paboyle@ph.ed.ac.uk>
|
Author: paboyle <paboyle@ph.ed.ac.uk>
|
||||||
@ -32,6 +32,9 @@ using namespace std;
|
|||||||
using namespace Grid;
|
using namespace Grid;
|
||||||
using namespace Grid::QCD;
|
using namespace Grid::QCD;
|
||||||
|
|
||||||
|
|
||||||
|
#include "Grid/util/Profiling.h"
|
||||||
|
|
||||||
template<class d>
|
template<class d>
|
||||||
struct scal {
|
struct scal {
|
||||||
d internal;
|
d internal;
|
||||||
@ -45,6 +48,7 @@ struct scal {
|
|||||||
};
|
};
|
||||||
|
|
||||||
bool overlapComms = false;
|
bool overlapComms = false;
|
||||||
|
bool perfProfiling = false;
|
||||||
|
|
||||||
int main (int argc, char ** argv)
|
int main (int argc, char ** argv)
|
||||||
{
|
{
|
||||||
@ -53,6 +57,12 @@ int main (int argc, char ** argv)
|
|||||||
if( GridCmdOptionExists(argv,argv+argc,"--asynch") ){
|
if( GridCmdOptionExists(argv,argv+argc,"--asynch") ){
|
||||||
overlapComms = true;
|
overlapComms = true;
|
||||||
}
|
}
|
||||||
|
if( GridCmdOptionExists(argv,argv+argc,"--perf") ){
|
||||||
|
perfProfiling = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
long unsigned int single_site_flops = 8*QCD::Nc*(7+16*QCD::Nc);
|
||||||
|
|
||||||
|
|
||||||
std::vector<int> latt_size = GridDefaultLatt();
|
std::vector<int> latt_size = GridDefaultLatt();
|
||||||
std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd());
|
std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd());
|
||||||
@ -61,10 +71,15 @@ int main (int argc, char ** argv)
|
|||||||
GridRedBlackCartesian RBGrid(&Grid);
|
GridRedBlackCartesian RBGrid(&Grid);
|
||||||
|
|
||||||
int threads = GridThread::GetThreads();
|
int threads = GridThread::GetThreads();
|
||||||
std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl;
|
|
||||||
|
GridLogLayout();
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "Grid floating point word size is REALF"<< sizeof(RealF)<<std::endl;
|
std::cout<<GridLogMessage << "Grid floating point word size is REALF"<< sizeof(RealF)<<std::endl;
|
||||||
std::cout<<GridLogMessage << "Grid floating point word size is REALD"<< sizeof(RealD)<<std::endl;
|
std::cout<<GridLogMessage << "Grid floating point word size is REALD"<< sizeof(RealD)<<std::endl;
|
||||||
std::cout<<GridLogMessage << "Grid floating point word size is REAL"<< sizeof(Real)<<std::endl;
|
std::cout<<GridLogMessage << "Grid floating point word size is REAL"<< sizeof(Real)<<std::endl;
|
||||||
|
std::cout<<GridLogMessage << "Grid number of colours : "<< QCD::Nc <<std::endl;
|
||||||
|
std::cout<<GridLogMessage << "Benchmarking Wilson operator in the fundamental representation" << std::endl;
|
||||||
|
|
||||||
|
|
||||||
std::vector<int> seeds({1,2,3,4});
|
std::vector<int> seeds({1,2,3,4});
|
||||||
GridParallelRNG pRNG(&Grid);
|
GridParallelRNG pRNG(&Grid);
|
||||||
@ -134,9 +149,25 @@ int main (int argc, char ** argv)
|
|||||||
Dw.Dhop(src,result,0);
|
Dw.Dhop(src,result,0);
|
||||||
}
|
}
|
||||||
double t1=usecond();
|
double t1=usecond();
|
||||||
double flops=1344*volume*ncall;
|
double flops=single_site_flops*volume*ncall;
|
||||||
|
|
||||||
|
if (perfProfiling){
|
||||||
|
std::cout<<GridLogMessage << "Profiling Dw with perf"<<std::endl;
|
||||||
|
|
||||||
|
System::profile("kernel", [&]() {
|
||||||
|
for(int i=0;i<ncall;i++){
|
||||||
|
Dw.Dhop(src,result,0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
std::cout<<GridLogMessage << "Generated kernel.data"<<std::endl;
|
||||||
|
std::cout<<GridLogMessage << "Use with: perf report -i kernel.data"<<std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "Called Dw"<<std::endl;
|
std::cout<<GridLogMessage << "Called Dw"<<std::endl;
|
||||||
|
std::cout<<GridLogMessage << "flops per site " << single_site_flops << std::endl;
|
||||||
std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl;
|
std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl;
|
||||||
std::cout<<GridLogMessage << "norm ref "<< norm2(ref)<<std::endl;
|
std::cout<<GridLogMessage << "norm ref "<< norm2(ref)<<std::endl;
|
||||||
std::cout<<GridLogMessage << "mflop/s = "<< flops/(t1-t0)<<std::endl;
|
std::cout<<GridLogMessage << "mflop/s = "<< flops/(t1-t0)<<std::endl;
|
||||||
|
@ -62,6 +62,7 @@ int main (int argc, char ** argv)
|
|||||||
std::cout << GridLogMessage<< "* Kernel options --dslash-generic, --dslash-unroll, --dslash-asm" <<std::endl;
|
std::cout << GridLogMessage<< "* Kernel options --dslash-generic, --dslash-unroll, --dslash-asm" <<std::endl;
|
||||||
std::cout << GridLogMessage<< "*****************************************************************" <<std::endl;
|
std::cout << GridLogMessage<< "*****************************************************************" <<std::endl;
|
||||||
std::cout << GridLogMessage<< "*****************************************************************" <<std::endl;
|
std::cout << GridLogMessage<< "*****************************************************************" <<std::endl;
|
||||||
|
std::cout << GridLogMessage<< "* Number of colours "<< QCD::Nc <<std::endl;
|
||||||
std::cout << GridLogMessage<< "* Benchmarking WilsonFermionR::Dhop "<<std::endl;
|
std::cout << GridLogMessage<< "* Benchmarking WilsonFermionR::Dhop "<<std::endl;
|
||||||
std::cout << GridLogMessage<< "* Vectorising space-time by "<<vComplex::Nsimd()<<std::endl;
|
std::cout << GridLogMessage<< "* Vectorising space-time by "<<vComplex::Nsimd()<<std::endl;
|
||||||
if ( sizeof(Real)==4 ) std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl;
|
if ( sizeof(Real)==4 ) std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl;
|
||||||
@ -69,13 +70,15 @@ int main (int argc, char ** argv)
|
|||||||
if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl;
|
if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl;
|
||||||
if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3 WilsonKernels" <<std::endl;
|
if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3 WilsonKernels" <<std::endl;
|
||||||
if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3 WilsonKernels" <<std::endl;
|
if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3 WilsonKernels" <<std::endl;
|
||||||
|
std::cout << GridLogMessage << "* OpenMP threads : "<< GridThread::GetThreads() <<std::endl;
|
||||||
|
std::cout << GridLogMessage << "* MPI tasks : "<< GridCmdVectorIntToString(mpi_layout) << std::endl;
|
||||||
std::cout << GridLogMessage<< "*****************************************************************" <<std::endl;
|
std::cout << GridLogMessage<< "*****************************************************************" <<std::endl;
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "============================================================================="<< std::endl;
|
std::cout<<GridLogMessage << "================================================================================================="<< std::endl;
|
||||||
std::cout<<GridLogMessage << "= Benchmarking Wilson" << std::endl;
|
std::cout<<GridLogMessage << "= Benchmarking Wilson operator in the fundamental representation" << std::endl;
|
||||||
std::cout<<GridLogMessage << "============================================================================="<< std::endl;
|
std::cout<<GridLogMessage << "================================================================================================="<< std::endl;
|
||||||
std::cout<<GridLogMessage << "Volume\t\t\tWilson/MFLOPs\tWilsonDag/MFLOPs" << std::endl;
|
std::cout<<GridLogMessage << "Volume\t\t\tWilson/MFLOPs\tWilsonDag/MFLOPs\tWilsonEO/MFLOPs\tWilsonDagEO/MFLOPs" << std::endl;
|
||||||
std::cout<<GridLogMessage << "============================================================================="<< std::endl;
|
std::cout<<GridLogMessage << "================================================================================================="<< std::endl;
|
||||||
|
|
||||||
int Lmax = 32;
|
int Lmax = 32;
|
||||||
int dmin = 0;
|
int dmin = 0;
|
||||||
@ -97,13 +100,20 @@ int main (int argc, char ** argv)
|
|||||||
|
|
||||||
GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(seeds);
|
GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(seeds);
|
||||||
LatticeGaugeField Umu(&Grid); random(pRNG,Umu);
|
LatticeGaugeField Umu(&Grid); random(pRNG,Umu);
|
||||||
LatticeFermion src(&Grid); random(pRNG,src);
|
LatticeFermion src(&Grid); random(pRNG,src);
|
||||||
LatticeFermion result(&Grid); result=zero;
|
LatticeFermion src_o(&RBGrid); pickCheckerboard(Odd,src_o,src);
|
||||||
|
LatticeFermion result(&Grid); result=zero;
|
||||||
|
LatticeFermion result_e(&RBGrid); result_e=zero;
|
||||||
|
|
||||||
double volume = std::accumulate(latt_size.begin(),latt_size.end(),1,std::multiplies<int>());
|
double volume = std::accumulate(latt_size.begin(),latt_size.end(),1,std::multiplies<int>());
|
||||||
|
|
||||||
WilsonFermionR Dw(Umu,Grid,RBGrid,mass,params);
|
WilsonFermionR Dw(Umu,Grid,RBGrid,mass,params);
|
||||||
|
|
||||||
|
// Full operator
|
||||||
|
bench_wilson(src,result,Dw,volume,DaggerNo);
|
||||||
|
bench_wilson(src,result,Dw,volume,DaggerYes);
|
||||||
|
std::cout << "\t";
|
||||||
|
// EO
|
||||||
bench_wilson(src,result,Dw,volume,DaggerNo);
|
bench_wilson(src,result,Dw,volume,DaggerNo);
|
||||||
bench_wilson(src,result,Dw,volume,DaggerYes);
|
bench_wilson(src,result,Dw,volume,DaggerYes);
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
@ -122,9 +132,26 @@ void bench_wilson (
|
|||||||
int const dag )
|
int const dag )
|
||||||
{
|
{
|
||||||
int ncall = 1000;
|
int ncall = 1000;
|
||||||
|
long unsigned int single_site_flops = 8*QCD::Nc*(7+16*QCD::Nc);
|
||||||
double t0 = usecond();
|
double t0 = usecond();
|
||||||
for(int i=0; i<ncall; i++) { Dw.Dhop(src,result,dag); }
|
for(int i=0; i<ncall; i++) { Dw.Dhop(src,result,dag); }
|
||||||
double t1 = usecond();
|
double t1 = usecond();
|
||||||
double flops = 1344 * volume * ncall;
|
double flops = single_site_flops * volume * ncall;
|
||||||
|
std::cout << flops/(t1-t0) << "\t\t";
|
||||||
|
}
|
||||||
|
|
||||||
|
void bench_wilson_eo (
|
||||||
|
LatticeFermion & src,
|
||||||
|
LatticeFermion & result,
|
||||||
|
WilsonFermionR & Dw,
|
||||||
|
double const volume,
|
||||||
|
int const dag )
|
||||||
|
{
|
||||||
|
int ncall = 1000;
|
||||||
|
long unsigned int single_site_flops = 8*QCD::Nc*(7+16*QCD::Nc);
|
||||||
|
double t0 = usecond();
|
||||||
|
for(int i=0; i<ncall; i++) { Dw.DhopEO(src,result,dag); }
|
||||||
|
double t1 = usecond();
|
||||||
|
double flops = (single_site_flops * volume * ncall)/2.0;
|
||||||
std::cout << flops/(t1-t0) << "\t\t";
|
std::cout << flops/(t1-t0) << "\t\t";
|
||||||
}
|
}
|
||||||
|
@ -249,6 +249,9 @@ case ${ax_cv_cxx_compiler_vendor} in
|
|||||||
AVX512)
|
AVX512)
|
||||||
AC_DEFINE([AVX512],[1],[AVX512 intrinsics])
|
AC_DEFINE([AVX512],[1],[AVX512 intrinsics])
|
||||||
SIMD_FLAGS='-mavx512f -mavx512pf -mavx512er -mavx512cd';;
|
SIMD_FLAGS='-mavx512f -mavx512pf -mavx512er -mavx512cd';;
|
||||||
|
SKL)
|
||||||
|
AC_DEFINE([AVX512],[1],[AVX512 intrinsics for SkyLake Xeon])
|
||||||
|
SIMD_FLAGS='-march=skylake-avx512';;
|
||||||
KNC)
|
KNC)
|
||||||
AC_DEFINE([IMCI],[1],[IMCI intrinsics for Knights Corner])
|
AC_DEFINE([IMCI],[1],[IMCI intrinsics for Knights Corner])
|
||||||
SIMD_FLAGS='';;
|
SIMD_FLAGS='';;
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Application.cc
|
Source file: extras/Hadrons/Application.cc
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
@ -43,12 +42,7 @@ using namespace Hadrons;
|
|||||||
// constructors ////////////////////////////////////////////////////////////////
|
// constructors ////////////////////////////////////////////////////////////////
|
||||||
Application::Application(void)
|
Application::Application(void)
|
||||||
{
|
{
|
||||||
LOG(Message) << "Modules available:" << std::endl;
|
initLogger();
|
||||||
auto list = ModuleFactory::getInstance().getBuilderList();
|
|
||||||
for (auto &m: list)
|
|
||||||
{
|
|
||||||
LOG(Message) << " " << m << std::endl;
|
|
||||||
}
|
|
||||||
auto dim = GridDefaultLatt(), mpi = GridDefaultMpi(), loc(dim);
|
auto dim = GridDefaultLatt(), mpi = GridDefaultMpi(), loc(dim);
|
||||||
locVol_ = 1;
|
locVol_ = 1;
|
||||||
for (unsigned int d = 0; d < dim.size(); ++d)
|
for (unsigned int d = 0; d < dim.size(); ++d)
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Application.hpp
|
Source file: extras/Hadrons/Application.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Environment.cc
|
Source file: extras/Hadrons/Environment.cc
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Environment.hpp
|
Source file: extras/Hadrons/Environment.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Exceptions.cc
|
Source file: extras/Hadrons/Exceptions.cc
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Exceptions.hpp
|
Source file: extras/Hadrons/Exceptions.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Factory.hpp
|
Source file: extras/Hadrons/Factory.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/GeneticScheduler.hpp
|
Source file: extras/Hadrons/GeneticScheduler.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Global.cc
|
Source file: extras/Hadrons/Global.cc
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
@ -39,6 +38,21 @@ HadronsLogger Hadrons::HadronsLogMessage(1,"Message");
|
|||||||
HadronsLogger Hadrons::HadronsLogIterative(1,"Iterative");
|
HadronsLogger Hadrons::HadronsLogIterative(1,"Iterative");
|
||||||
HadronsLogger Hadrons::HadronsLogDebug(1,"Debug");
|
HadronsLogger Hadrons::HadronsLogDebug(1,"Debug");
|
||||||
|
|
||||||
|
void Hadrons::initLogger(void)
|
||||||
|
{
|
||||||
|
auto w = std::string("Hadrons").length();
|
||||||
|
GridLogError.setTopWidth(w);
|
||||||
|
GridLogWarning.setTopWidth(w);
|
||||||
|
GridLogMessage.setTopWidth(w);
|
||||||
|
GridLogIterative.setTopWidth(w);
|
||||||
|
GridLogDebug.setTopWidth(w);
|
||||||
|
HadronsLogError.Active(GridLogError.isActive());
|
||||||
|
HadronsLogWarning.Active(GridLogWarning.isActive());
|
||||||
|
HadronsLogMessage.Active(GridLogMessage.isActive());
|
||||||
|
HadronsLogIterative.Active(GridLogIterative.isActive());
|
||||||
|
HadronsLogDebug.Active(GridLogDebug.isActive());
|
||||||
|
}
|
||||||
|
|
||||||
// type utilities //////////////////////////////////////////////////////////////
|
// type utilities //////////////////////////////////////////////////////////////
|
||||||
constexpr unsigned int maxNameSize = 1024u;
|
constexpr unsigned int maxNameSize = 1024u;
|
||||||
|
|
||||||
@ -53,3 +67,10 @@ std::string Hadrons::typeName(const std::type_info *info)
|
|||||||
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// default writers/readers /////////////////////////////////////////////////////
|
||||||
|
#ifdef HAVE_HDF5
|
||||||
|
const std::string Hadrons::resultFileExt = "h5";
|
||||||
|
#else
|
||||||
|
const std::string Hadrons::resultFileExt = "xml";
|
||||||
|
#endif
|
||||||
|
@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Global.hpp
|
Source file: extras/Hadrons/Global.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -61,6 +61,9 @@ using Grid::operator<<;
|
|||||||
#ifndef SIMPL
|
#ifndef SIMPL
|
||||||
#define SIMPL ScalarImplCR
|
#define SIMPL ScalarImplCR
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef GIMPL
|
||||||
|
#define GIMPL GimplTypesR
|
||||||
|
#endif
|
||||||
|
|
||||||
BEGIN_HADRONS_NAMESPACE
|
BEGIN_HADRONS_NAMESPACE
|
||||||
|
|
||||||
@ -84,7 +87,8 @@ typedef std::function<void(FermionField##suffix &,\
|
|||||||
const FermionField##suffix &)> SolverFn##suffix;
|
const FermionField##suffix &)> SolverFn##suffix;
|
||||||
|
|
||||||
#define SINK_TYPE_ALIASES(suffix)\
|
#define SINK_TYPE_ALIASES(suffix)\
|
||||||
typedef std::function<SlicedPropagator##suffix(const PropagatorField##suffix &)> SinkFn##suffix;
|
typedef std::function<SlicedPropagator##suffix\
|
||||||
|
(const PropagatorField##suffix &)> SinkFn##suffix;
|
||||||
|
|
||||||
#define FGS_TYPE_ALIASES(FImpl, suffix)\
|
#define FGS_TYPE_ALIASES(FImpl, suffix)\
|
||||||
FERM_TYPE_ALIASES(FImpl, suffix)\
|
FERM_TYPE_ALIASES(FImpl, suffix)\
|
||||||
@ -108,6 +112,8 @@ extern HadronsLogger HadronsLogMessage;
|
|||||||
extern HadronsLogger HadronsLogIterative;
|
extern HadronsLogger HadronsLogIterative;
|
||||||
extern HadronsLogger HadronsLogDebug;
|
extern HadronsLogger HadronsLogDebug;
|
||||||
|
|
||||||
|
void initLogger(void);
|
||||||
|
|
||||||
// singleton pattern
|
// singleton pattern
|
||||||
#define SINGLETON(name)\
|
#define SINGLETON(name)\
|
||||||
public:\
|
public:\
|
||||||
@ -161,14 +167,19 @@ std::string typeName(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// default writers/readers
|
// default writers/readers
|
||||||
|
extern const std::string resultFileExt;
|
||||||
|
|
||||||
#ifdef HAVE_HDF5
|
#ifdef HAVE_HDF5
|
||||||
typedef Hdf5Reader CorrReader;
|
typedef Hdf5Reader ResultReader;
|
||||||
typedef Hdf5Writer CorrWriter;
|
typedef Hdf5Writer ResultWriter;
|
||||||
#else
|
#else
|
||||||
typedef XmlReader CorrReader;
|
typedef XmlReader ResultReader;
|
||||||
typedef XmlWriter CorrWriter;
|
typedef XmlWriter ResultWriter;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define RESULT_FILE_NAME(name) \
|
||||||
|
name + "." + std::to_string(vm().getTrajectory()) + "." + resultFileExt
|
||||||
|
|
||||||
END_HADRONS_NAMESPACE
|
END_HADRONS_NAMESPACE
|
||||||
|
|
||||||
#include <Grid/Hadrons/Exceptions.hpp>
|
#include <Grid/Hadrons/Exceptions.hpp>
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Graph.hpp
|
Source file: extras/Hadrons/Graph.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/HadronsXmlRun.cc
|
Source file: extras/Hadrons/HadronsXmlRun.cc
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
@ -55,12 +54,6 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
// initialization
|
// initialization
|
||||||
Grid_init(&argc, &argv);
|
Grid_init(&argc, &argv);
|
||||||
HadronsLogError.Active(GridLogError.isActive());
|
|
||||||
HadronsLogWarning.Active(GridLogWarning.isActive());
|
|
||||||
HadronsLogMessage.Active(GridLogMessage.isActive());
|
|
||||||
HadronsLogIterative.Active(GridLogIterative.isActive());
|
|
||||||
HadronsLogDebug.Active(GridLogDebug.isActive());
|
|
||||||
LOG(Message) << "Grid initialized" << std::endl;
|
|
||||||
|
|
||||||
// execution
|
// execution
|
||||||
Application application(parameterFileName);
|
Application application(parameterFileName);
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/HadronsXmlSchedule.cc
|
Source file: extras/Hadrons/HadronsXmlSchedule.cc
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
@ -49,12 +48,6 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
// initialization
|
// initialization
|
||||||
Grid_init(&argc, &argv);
|
Grid_init(&argc, &argv);
|
||||||
HadronsLogError.Active(GridLogError.isActive());
|
|
||||||
HadronsLogWarning.Active(GridLogWarning.isActive());
|
|
||||||
HadronsLogMessage.Active(GridLogMessage.isActive());
|
|
||||||
HadronsLogIterative.Active(GridLogIterative.isActive());
|
|
||||||
HadronsLogDebug.Active(GridLogDebug.isActive());
|
|
||||||
LOG(Message) << "Grid initialized" << std::endl;
|
|
||||||
|
|
||||||
// execution
|
// execution
|
||||||
Application application;
|
Application application;
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Module.cc
|
Source file: extras/Hadrons/Module.cc
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Module.hpp
|
Source file: extras/Hadrons/Module.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/ModuleFactory.hpp
|
Source file: extras/Hadrons/ModuleFactory.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,11 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules.hpp
|
Source file: extras/Hadrons/Modules.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
Copyright (C) 2017
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -27,7 +26,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
See the full license in the file "LICENSE" in the top level distribution directory
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
*************************************************************************************/
|
*************************************************************************************/
|
||||||
/* END LEGAL */
|
/* END LEGAL */
|
||||||
|
|
||||||
#include <Grid/Hadrons/Modules/MContraction/Baryon.hpp>
|
#include <Grid/Hadrons/Modules/MContraction/Baryon.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MContraction/Meson.hpp>
|
#include <Grid/Hadrons/Modules/MContraction/Meson.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MContraction/WeakHamiltonian.hpp>
|
#include <Grid/Hadrons/Modules/MContraction/WeakHamiltonian.hpp>
|
||||||
@ -46,10 +44,10 @@ See the full license in the file "LICENSE" in the top level distribution directo
|
|||||||
#include <Grid/Hadrons/Modules/MSink/Smear.hpp>
|
#include <Grid/Hadrons/Modules/MSink/Smear.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MSink/Point.hpp>
|
#include <Grid/Hadrons/Modules/MSink/Point.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MSolver/RBPrecCG.hpp>
|
#include <Grid/Hadrons/Modules/MSolver/RBPrecCG.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MGauge/Load.hpp>
|
|
||||||
#include <Grid/Hadrons/Modules/MGauge/Unit.hpp>
|
#include <Grid/Hadrons/Modules/MGauge/Unit.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MGauge/Random.hpp>
|
#include <Grid/Hadrons/Modules/MGauge/Random.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MGauge/StochEm.hpp>
|
#include <Grid/Hadrons/Modules/MGauge/StochEm.hpp>
|
||||||
|
#include <Grid/Hadrons/Modules/MGauge/FundtoHirep.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MUtilities/TestSeqGamma.hpp>
|
#include <Grid/Hadrons/Modules/MUtilities/TestSeqGamma.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MUtilities/TestSeqConserved.hpp>
|
#include <Grid/Hadrons/Modules/MUtilities/TestSeqConserved.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MLoop/NoiseLoop.hpp>
|
#include <Grid/Hadrons/Modules/MLoop/NoiseLoop.hpp>
|
||||||
@ -58,3 +56,10 @@ See the full license in the file "LICENSE" in the top level distribution directo
|
|||||||
#include <Grid/Hadrons/Modules/MScalar/ChargedProp.hpp>
|
#include <Grid/Hadrons/Modules/MScalar/ChargedProp.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MAction/DWF.hpp>
|
#include <Grid/Hadrons/Modules/MAction/DWF.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MAction/Wilson.hpp>
|
#include <Grid/Hadrons/Modules/MAction/Wilson.hpp>
|
||||||
|
#include <Grid/Hadrons/Modules/MAction/WilsonClover.hpp>
|
||||||
|
#include <Grid/Hadrons/Modules/MScalarSUN/Div.hpp>
|
||||||
|
#include <Grid/Hadrons/Modules/MScalarSUN/TrMag.hpp>
|
||||||
|
#include <Grid/Hadrons/Modules/MScalarSUN/TwoPoint.hpp>
|
||||||
|
#include <Grid/Hadrons/Modules/MScalarSUN/TrPhi.hpp>
|
||||||
|
#include <Grid/Hadrons/Modules/MIO/LoadNersc.hpp>
|
||||||
|
#include <Grid/Hadrons/Modules/MIO/LoadBinary.hpp>
|
||||||
|
@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MAction/DWF.hpp
|
Source file: extras/Hadrons/Modules/MAction/DWF.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MAction/Wilson.hpp
|
Source file: extras/Hadrons/Modules/MAction/Wilson.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
153
extras/Hadrons/Modules/MAction/WilsonClover.hpp
Normal file
153
extras/Hadrons/Modules/MAction/WilsonClover.hpp
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MAction/Wilson.hpp
|
||||||
|
|
||||||
|
Copyright (C) 2015
|
||||||
|
Copyright (C) 2016
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
|
|
||||||
|
#ifndef Hadrons_MAction_WilsonClover_hpp_
|
||||||
|
#define Hadrons_MAction_WilsonClover_hpp_
|
||||||
|
|
||||||
|
#include <Grid/Hadrons/Global.hpp>
|
||||||
|
#include <Grid/Hadrons/Module.hpp>
|
||||||
|
#include <Grid/Hadrons/ModuleFactory.hpp>
|
||||||
|
|
||||||
|
BEGIN_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* TWilson quark action *
|
||||||
|
******************************************************************************/
|
||||||
|
BEGIN_MODULE_NAMESPACE(MAction)
|
||||||
|
|
||||||
|
class WilsonCloverPar: Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonCloverPar,
|
||||||
|
std::string, gauge,
|
||||||
|
double , mass,
|
||||||
|
double , csw_r,
|
||||||
|
double , csw_t,
|
||||||
|
WilsonAnisotropyCoefficients ,clover_anisotropy,
|
||||||
|
std::string, boundary
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename FImpl>
|
||||||
|
class TWilsonClover: public Module<WilsonCloverPar>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FGS_TYPE_ALIASES(FImpl,);
|
||||||
|
public:
|
||||||
|
// constructor
|
||||||
|
TWilsonClover(const std::string name);
|
||||||
|
// destructor
|
||||||
|
virtual ~TWilsonClover(void) = default;
|
||||||
|
// dependencies/products
|
||||||
|
virtual std::vector<std::string> getInput(void);
|
||||||
|
virtual std::vector<std::string> getOutput(void);
|
||||||
|
// setup
|
||||||
|
virtual void setup(void);
|
||||||
|
// execution
|
||||||
|
virtual void execute(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
MODULE_REGISTER_NS(WilsonClover, TWilsonClover<FIMPL>, MAction);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* TWilsonClover template implementation *
|
||||||
|
******************************************************************************/
|
||||||
|
// constructor /////////////////////////////////////////////////////////////////
|
||||||
|
template <typename FImpl>
|
||||||
|
TWilsonClover<FImpl>::TWilsonClover(const std::string name)
|
||||||
|
: Module<WilsonCloverPar>(name)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// dependencies/products ///////////////////////////////////////////////////////
|
||||||
|
template <typename FImpl>
|
||||||
|
std::vector<std::string> TWilsonClover<FImpl>::getInput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> in = {par().gauge};
|
||||||
|
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename FImpl>
|
||||||
|
std::vector<std::string> TWilsonClover<FImpl>::getOutput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> out = {getName()};
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup ///////////////////////////////////////////////////////////////////////
|
||||||
|
template <typename FImpl>
|
||||||
|
void TWilsonClover<FImpl>::setup(void)
|
||||||
|
{
|
||||||
|
//unsigned int size;
|
||||||
|
|
||||||
|
// size = 2*env().template lattice4dSize<typename FImpl::DoubledGaugeField>();
|
||||||
|
// env().registerObject(getName(), size);
|
||||||
|
|
||||||
|
|
||||||
|
LOG(Message) << "Setting up TWilsonClover fermion matrix with m= " << par().mass
|
||||||
|
<< " using gauge field '" << par().gauge << "'" << std::endl;
|
||||||
|
LOG(Message) << "Fermion boundary conditions: " << par().boundary
|
||||||
|
<< std::endl;
|
||||||
|
LOG(Message) << "Clover term csw_r: " << par().csw_r
|
||||||
|
<< " csw_t: " << par().csw_t
|
||||||
|
<< std::endl;
|
||||||
|
auto &U = envGet(LatticeGaugeField, par().gauge);
|
||||||
|
auto &grid = *env().getGrid();
|
||||||
|
auto &gridRb = *env().getRbGrid();
|
||||||
|
std::vector<Complex> boundary = strToVec<Complex>(par().boundary);
|
||||||
|
typename WilsonCloverFermion<FImpl>::ImplParams implParams(boundary);
|
||||||
|
envCreateDerived(FMat, WilsonCloverFermion<FImpl>, getName(), 1, U, grid, gridRb, par().mass,
|
||||||
|
par().csw_r,
|
||||||
|
par().csw_t,
|
||||||
|
par().clover_anisotropy,
|
||||||
|
implParams);
|
||||||
|
|
||||||
|
|
||||||
|
//FMat *fMatPt = new WilsonCloverFermion<FImpl>(U, grid, gridRb, par().mass,
|
||||||
|
// par().csw_r,
|
||||||
|
// par().csw_t,
|
||||||
|
// par().clover_anisotropy,
|
||||||
|
// implParams);
|
||||||
|
//env().setObject(getName(), fMatPt);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// execution ///////////////////////////////////////////////////////////////////
|
||||||
|
template <typename FImpl>
|
||||||
|
void TWilsonClover<FImpl>::execute()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
END_MODULE_NAMESPACE
|
||||||
|
|
||||||
|
END_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
#endif // Hadrons_WilsonClover_hpp_
|
@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/Baryon.hpp
|
Source file: extras/Hadrons/Modules/MContraction/Baryon.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -122,7 +122,7 @@ void TBaryon<FImpl1, FImpl2, FImpl3>::execute(void)
|
|||||||
<< " quarks '" << par().q1 << "', '" << par().q2 << "', and '"
|
<< " quarks '" << par().q1 << "', '" << par().q2 << "', and '"
|
||||||
<< par().q3 << "'" << std::endl;
|
<< par().q3 << "'" << std::endl;
|
||||||
|
|
||||||
CorrWriter writer(par().output);
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
auto &q1 = envGet(PropagatorField1, par().q1);
|
auto &q1 = envGet(PropagatorField1, par().q1);
|
||||||
auto &q2 = envGet(PropagatorField2, par().q2);
|
auto &q2 = envGet(PropagatorField2, par().q2);
|
||||||
auto &q3 = envGet(PropagatorField3, par().q2);
|
auto &q3 = envGet(PropagatorField3, par().q2);
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/DiscLoop.hpp
|
Source file: extras/Hadrons/Modules/MContraction/DiscLoop.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -118,7 +119,7 @@ void TDiscLoop<FImpl>::execute(void)
|
|||||||
<< "' using '" << par().q_loop << "' with " << par().gamma
|
<< "' using '" << par().q_loop << "' with " << par().gamma
|
||||||
<< " insertion." << std::endl;
|
<< " insertion." << std::endl;
|
||||||
|
|
||||||
CorrWriter writer(par().output);
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
auto &q_loop = envGet(PropagatorField, par().q_loop);
|
auto &q_loop = envGet(PropagatorField, par().q_loop);
|
||||||
Gamma gamma(par().gamma);
|
Gamma gamma(par().gamma);
|
||||||
std::vector<TComplex> buf;
|
std::vector<TComplex> buf;
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/Gamma3pt.hpp
|
Source file: extras/Hadrons/Modules/MContraction/Gamma3pt.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -152,7 +153,7 @@ void TGamma3pt<FImpl1, FImpl2, FImpl3>::execute(void)
|
|||||||
|
|
||||||
// Initialise variables. q2 and q3 are normal propagators, q1 may be
|
// Initialise variables. q2 and q3 are normal propagators, q1 may be
|
||||||
// sink smeared.
|
// sink smeared.
|
||||||
CorrWriter writer(par().output);
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
auto &q1 = envGet(SlicedPropagator1, par().q1);
|
auto &q1 = envGet(SlicedPropagator1, par().q1);
|
||||||
auto &q2 = envGet(PropagatorField2, par().q2);
|
auto &q2 = envGet(PropagatorField2, par().q2);
|
||||||
auto &q3 = envGet(PropagatorField2, par().q3);
|
auto &q3 = envGet(PropagatorField2, par().q3);
|
||||||
|
@ -4,12 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/Meson.hpp
|
Source file: extras/Hadrons/Modules/MContraction/Meson.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
Copyright (C) 2017
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -174,7 +172,7 @@ void TMeson<FImpl1, FImpl2>::execute(void)
|
|||||||
<< " quarks '" << par().q1 << "' and '" << par().q2 << "'"
|
<< " quarks '" << par().q1 << "' and '" << par().q2 << "'"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
|
||||||
CorrWriter writer(par().output);
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
std::vector<TComplex> buf;
|
std::vector<TComplex> buf;
|
||||||
std::vector<Result> result;
|
std::vector<Result> result;
|
||||||
Gamma g5(Gamma::Algebra::Gamma5);
|
Gamma g5(Gamma::Algebra::Gamma5);
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/WardIdentity.hpp
|
Source file: extras/Hadrons/Modules/MContraction/WardIdentity.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp
|
Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc
|
Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -103,7 +104,7 @@ void TWeakHamiltonianEye::execute(void)
|
|||||||
<< par().q2 << ", '" << par().q3 << "' and '" << par().q4
|
<< par().q2 << ", '" << par().q3 << "' and '" << par().q4
|
||||||
<< "'." << std::endl;
|
<< "'." << std::endl;
|
||||||
|
|
||||||
CorrWriter writer(par().output);
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
auto &q1 = envGet(SlicedPropagator, par().q1);
|
auto &q1 = envGet(SlicedPropagator, par().q1);
|
||||||
auto &q2 = envGet(PropagatorField, par().q2);
|
auto &q2 = envGet(PropagatorField, par().q2);
|
||||||
auto &q3 = envGet(PropagatorField, par().q3);
|
auto &q3 = envGet(PropagatorField, par().q3);
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp
|
Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc
|
Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -103,7 +104,7 @@ void TWeakHamiltonianNonEye::execute(void)
|
|||||||
<< par().q2 << ", '" << par().q3 << "' and '" << par().q4
|
<< par().q2 << ", '" << par().q3 << "' and '" << par().q4
|
||||||
<< "'." << std::endl;
|
<< "'." << std::endl;
|
||||||
|
|
||||||
CorrWriter writer(par().output);
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
auto &q1 = envGet(PropagatorField, par().q1);
|
auto &q1 = envGet(PropagatorField, par().q1);
|
||||||
auto &q2 = envGet(PropagatorField, par().q2);
|
auto &q2 = envGet(PropagatorField, par().q2);
|
||||||
auto &q3 = envGet(PropagatorField, par().q3);
|
auto &q3 = envGet(PropagatorField, par().q3);
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp
|
Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc
|
Source file: extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -103,7 +104,7 @@ void TWeakNeutral4ptDisc::execute(void)
|
|||||||
<< par().q2 << ", '" << par().q3 << "' and '" << par().q4
|
<< par().q2 << ", '" << par().q3 << "' and '" << par().q4
|
||||||
<< "'." << std::endl;
|
<< "'." << std::endl;
|
||||||
|
|
||||||
CorrWriter writer(par().output);
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
auto &q1 = envGet(PropagatorField, par().q1);
|
auto &q1 = envGet(PropagatorField, par().q1);
|
||||||
auto &q2 = envGet(PropagatorField, par().q2);
|
auto &q2 = envGet(PropagatorField, par().q2);
|
||||||
auto &q3 = envGet(PropagatorField, par().q3);
|
auto &q3 = envGet(PropagatorField, par().q3);
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp
|
Source file: extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,12 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MFermion/GaugeProp.hpp
|
Source file: extras/Hadrons/Modules/MFermion/GaugeProp.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
Copyright (C) 2017
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -96,7 +94,6 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
MODULE_REGISTER_NS(GaugeProp, TGaugeProp<FIMPL>, MFermion);
|
MODULE_REGISTER_NS(GaugeProp, TGaugeProp<FIMPL>, MFermion);
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TGaugeProp implementation *
|
* TGaugeProp implementation *
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
@ -156,7 +153,7 @@ void TGaugeProp<FImpl>::execute(void)
|
|||||||
LOG(Message) << "Inverting using solver '" << par().solver
|
LOG(Message) << "Inverting using solver '" << par().solver
|
||||||
<< "' on source '" << par().source << "'" << std::endl;
|
<< "' on source '" << par().source << "'" << std::endl;
|
||||||
for (unsigned int s = 0; s < Ns; ++s)
|
for (unsigned int s = 0; s < Ns; ++s)
|
||||||
for (unsigned int c = 0; c < Nc; ++c)
|
for (unsigned int c = 0; c < FImpl::Dimension; ++c)
|
||||||
{
|
{
|
||||||
LOG(Message) << "Inversion for spin= " << s << ", color= " << c
|
LOG(Message) << "Inversion for spin= " << s << ", color= " << c
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
@ -165,11 +162,11 @@ void TGaugeProp<FImpl>::execute(void)
|
|||||||
{
|
{
|
||||||
if (Ls_ == 1)
|
if (Ls_ == 1)
|
||||||
{
|
{
|
||||||
PropToFerm(source, fullSrc, s, c);
|
PropToFerm<FImpl>(source, fullSrc, s, c);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PropToFerm(tmp, fullSrc, s, c);
|
PropToFerm<FImpl>(tmp, fullSrc, s, c);
|
||||||
make_5D(tmp, source, Ls_);
|
make_5D(tmp, source, Ls_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -182,18 +179,18 @@ void TGaugeProp<FImpl>::execute(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PropToFerm(source, fullSrc, s, c);
|
PropToFerm<FImpl>(source, fullSrc, s, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sol = zero;
|
sol = zero;
|
||||||
solver(sol, source);
|
solver(sol, source);
|
||||||
FermToProp(prop, sol, s, c);
|
FermToProp<FImpl>(prop, sol, s, c);
|
||||||
// create 4D propagators from 5D one if necessary
|
// create 4D propagators from 5D one if necessary
|
||||||
if (Ls_ > 1)
|
if (Ls_ > 1)
|
||||||
{
|
{
|
||||||
PropagatorField &p4d = envGet(PropagatorField, getName());
|
PropagatorField &p4d = envGet(PropagatorField, getName());
|
||||||
make_4D(sol, tmp, Ls_);
|
make_4D(sol, tmp, Ls_);
|
||||||
FermToProp(p4d, tmp, s, c);
|
FermToProp<FImpl>(p4d, tmp, s, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
75
extras/Hadrons/Modules/MGauge/FundtoHirep.cc
Normal file
75
extras/Hadrons/Modules/MGauge/FundtoHirep.cc
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MGauge/FundtoHirep.cc
|
||||||
|
|
||||||
|
Copyright (C) 2015
|
||||||
|
Copyright (C) 2016
|
||||||
|
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
|
|
||||||
|
#include <Grid/Hadrons/Modules/MGauge/FundtoHirep.hpp>
|
||||||
|
|
||||||
|
using namespace Grid;
|
||||||
|
using namespace Hadrons;
|
||||||
|
using namespace MGauge;
|
||||||
|
|
||||||
|
// constructor /////////////////////////////////////////////////////////////////
|
||||||
|
template <class Rep>
|
||||||
|
TFundtoHirep<Rep>::TFundtoHirep(const std::string name)
|
||||||
|
: Module<FundtoHirepPar>(name)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// dependencies/products ///////////////////////////////////////////////////////
|
||||||
|
template <class Rep>
|
||||||
|
std::vector<std::string> TFundtoHirep<Rep>::getInput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> in;
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Rep>
|
||||||
|
std::vector<std::string> TFundtoHirep<Rep>::getOutput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> out = {getName()};
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup ///////////////////////////////////////////////////////////////////////
|
||||||
|
template <typename Rep>
|
||||||
|
void TFundtoHirep<Rep>::setup(void)
|
||||||
|
{
|
||||||
|
env().template registerLattice<typename Rep::LatticeField>(getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// execution ///////////////////////////////////////////////////////////////////
|
||||||
|
template <class Rep>
|
||||||
|
void TFundtoHirep<Rep>::execute(void)
|
||||||
|
{
|
||||||
|
auto &U = *env().template getObject<LatticeGaugeField>(par().gaugeconf);
|
||||||
|
LOG(Message) << "Transforming Representation" << std::endl;
|
||||||
|
|
||||||
|
Rep TargetRepresentation(U._grid);
|
||||||
|
TargetRepresentation.update_representation(U);
|
||||||
|
|
||||||
|
typename Rep::LatticeField &URep = *env().template createLattice<typename Rep::LatticeField>(getName());
|
||||||
|
URep = TargetRepresentation.U;
|
||||||
|
}
|
77
extras/Hadrons/Modules/MGauge/FundtoHirep.hpp
Normal file
77
extras/Hadrons/Modules/MGauge/FundtoHirep.hpp
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MGauge/FundtoHirep.hpp
|
||||||
|
|
||||||
|
Copyright (C) 2015
|
||||||
|
Copyright (C) 2016
|
||||||
|
|
||||||
|
Author: David Preti <david.preti@to.infn.it>
|
||||||
|
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_MGauge_FundtoHirep_hpp_
|
||||||
|
#define Hadrons_MGauge_FundtoHirep_hpp_
|
||||||
|
|
||||||
|
#include <Grid/Hadrons/Global.hpp>
|
||||||
|
#include <Grid/Hadrons/Module.hpp>
|
||||||
|
#include <Grid/Hadrons/ModuleFactory.hpp>
|
||||||
|
|
||||||
|
BEGIN_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Load a NERSC configuration *
|
||||||
|
******************************************************************************/
|
||||||
|
BEGIN_MODULE_NAMESPACE(MGauge)
|
||||||
|
|
||||||
|
class FundtoHirepPar: Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(FundtoHirepPar,
|
||||||
|
std::string, gaugeconf);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Rep>
|
||||||
|
class TFundtoHirep: public Module<FundtoHirepPar>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// constructor
|
||||||
|
TFundtoHirep(const std::string name);
|
||||||
|
// destructor
|
||||||
|
virtual ~TFundtoHirep(void) = default;
|
||||||
|
// dependency relation
|
||||||
|
virtual std::vector<std::string> getInput(void);
|
||||||
|
virtual std::vector<std::string> getOutput(void);
|
||||||
|
// setup
|
||||||
|
void setup(void);
|
||||||
|
// execution
|
||||||
|
void execute(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
//MODULE_REGISTER_NS(FundtoAdjoint, TFundtoHirep<AdjointRepresentation>, MGauge);
|
||||||
|
//MODULE_REGISTER_NS(FundtoTwoIndexSym, TFundtoHirep<TwoIndexSymmetricRepresentation>, MGauge);
|
||||||
|
//MODULE_REGISTER_NS(FundtoTwoIndexAsym, TFundtoHirep<TwoIndexAntiSymmetricRepresentation>, MGauge);
|
||||||
|
|
||||||
|
END_MODULE_NAMESPACE
|
||||||
|
|
||||||
|
END_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
#endif // Hadrons_MGauge_FundtoHirep_hpp_
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MGauge/Random.cc
|
Source file: extras/Hadrons/Modules/MGauge/Random.cc
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MGauge/Random.hpp
|
Source file: extras/Hadrons/Modules/MGauge/Random.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,9 +4,9 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MGauge/StochEm.cc
|
Source file: extras/Hadrons/Modules/MGauge/StochEm.cc
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,9 +4,9 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MGauge/StochEm.hpp
|
Source file: extras/Hadrons/Modules/MGauge/StochEm.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MGauge/Unit.cc
|
Source file: extras/Hadrons/Modules/MGauge/Unit.cc
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MGauge/Unit.hpp
|
Source file: extras/Hadrons/Modules/MGauge/Unit.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
140
extras/Hadrons/Modules/MIO/LoadBinary.hpp
Normal file
140
extras/Hadrons/Modules/MIO/LoadBinary.hpp
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MIO/LoadBinary.hpp
|
||||||
|
|
||||||
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
|
#ifndef Hadrons_MIO_LoadBinary_hpp_
|
||||||
|
#define Hadrons_MIO_LoadBinary_hpp_
|
||||||
|
|
||||||
|
#include <Grid/Hadrons/Global.hpp>
|
||||||
|
#include <Grid/Hadrons/Module.hpp>
|
||||||
|
#include <Grid/Hadrons/ModuleFactory.hpp>
|
||||||
|
|
||||||
|
BEGIN_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Load a binary configurations *
|
||||||
|
******************************************************************************/
|
||||||
|
BEGIN_MODULE_NAMESPACE(MIO)
|
||||||
|
|
||||||
|
class LoadBinaryPar: Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(LoadBinaryPar,
|
||||||
|
std::string, file,
|
||||||
|
std::string, format);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Impl>
|
||||||
|
class TLoadBinary: public Module<LoadBinaryPar>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef typename Impl::Field Field;
|
||||||
|
typedef typename Impl::Simd Simd;
|
||||||
|
typedef typename Field::vector_object vobj;
|
||||||
|
typedef typename vobj::scalar_object sobj;
|
||||||
|
typedef typename sobj::DoublePrecision sobj_double;
|
||||||
|
typedef BinarySimpleMunger<sobj_double, sobj> Munger;
|
||||||
|
public:
|
||||||
|
// constructor
|
||||||
|
TLoadBinary(const std::string name);
|
||||||
|
// destructor
|
||||||
|
virtual ~TLoadBinary(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(LoadBinary, TLoadBinary<GIMPL>, MIO);
|
||||||
|
MODULE_REGISTER_NS(LoadBinaryScalarSU2, TLoadBinary<ScalarNxNAdjImplR<2>>, MIO);
|
||||||
|
MODULE_REGISTER_NS(LoadBinaryScalarSU3, TLoadBinary<ScalarNxNAdjImplR<3>>, MIO);
|
||||||
|
MODULE_REGISTER_NS(LoadBinaryScalarSU4, TLoadBinary<ScalarNxNAdjImplR<4>>, MIO);
|
||||||
|
MODULE_REGISTER_NS(LoadBinaryScalarSU5, TLoadBinary<ScalarNxNAdjImplR<5>>, MIO);
|
||||||
|
MODULE_REGISTER_NS(LoadBinaryScalarSU6, TLoadBinary<ScalarNxNAdjImplR<6>>, MIO);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* TLoadBinary implementation *
|
||||||
|
******************************************************************************/
|
||||||
|
// constructor /////////////////////////////////////////////////////////////////
|
||||||
|
template <typename Impl>
|
||||||
|
TLoadBinary<Impl>::TLoadBinary(const std::string name)
|
||||||
|
: Module<LoadBinaryPar>(name)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// dependencies/products ///////////////////////////////////////////////////////
|
||||||
|
template <typename Impl>
|
||||||
|
std::vector<std::string> TLoadBinary<Impl>::getInput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> in;
|
||||||
|
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Impl>
|
||||||
|
std::vector<std::string> TLoadBinary<Impl>::getOutput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> out = {getName()};
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup ///////////////////////////////////////////////////////////////////////
|
||||||
|
template <typename Impl>
|
||||||
|
void TLoadBinary<Impl>::setup(void)
|
||||||
|
{
|
||||||
|
envCreateLat(Field, getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// execution ///////////////////////////////////////////////////////////////////
|
||||||
|
template <typename Impl>
|
||||||
|
void TLoadBinary<Impl>::execute(void)
|
||||||
|
{
|
||||||
|
Munger munge;
|
||||||
|
uint32_t nersc_csum, scidac_csuma, scidac_csumb;
|
||||||
|
auto &U = envGet(Field, getName());
|
||||||
|
std::string filename = par().file + "."
|
||||||
|
+ std::to_string(vm().getTrajectory());
|
||||||
|
|
||||||
|
LOG(Message) << "Loading " << par().format
|
||||||
|
<< " binary configuration from file '" << filename
|
||||||
|
<< "'" << std::endl;
|
||||||
|
BinaryIO::readLatticeObject<vobj, sobj_double>(U, filename, munge, 0,
|
||||||
|
par().format, nersc_csum,
|
||||||
|
scidac_csuma, scidac_csumb);
|
||||||
|
LOG(Message) << "Checksums:" << std::endl;
|
||||||
|
LOG(Message) << " NERSC " << nersc_csum << std::endl;
|
||||||
|
LOG(Message) << " SciDAC A " << scidac_csuma << std::endl;
|
||||||
|
LOG(Message) << " SciDAC B " << scidac_csumb << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
END_MODULE_NAMESPACE
|
||||||
|
|
||||||
|
END_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
#endif // Hadrons_MIO_LoadBinary_hpp_
|
@ -2,10 +2,9 @@
|
|||||||
|
|
||||||
Grid physics library, www.github.com/paboyle/Grid
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MGauge/Load.cc
|
Source file: extras/Hadrons/Modules/MIO/LoadNersc.cc
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
@ -26,30 +25,29 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
See the full license in the file "LICENSE" in the top level distribution directory
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
*************************************************************************************/
|
*************************************************************************************/
|
||||||
/* END LEGAL */
|
/* END LEGAL */
|
||||||
|
#include <Grid/Hadrons/Modules/MIO/LoadNersc.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MGauge/Load.hpp>
|
|
||||||
|
|
||||||
using namespace Grid;
|
using namespace Grid;
|
||||||
using namespace Hadrons;
|
using namespace Hadrons;
|
||||||
using namespace MGauge;
|
using namespace MIO;
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TLoad implementation *
|
* TLoadNersc implementation *
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
// constructor /////////////////////////////////////////////////////////////////
|
// constructor /////////////////////////////////////////////////////////////////
|
||||||
TLoad::TLoad(const std::string name)
|
TLoadNersc::TLoadNersc(const std::string name)
|
||||||
: Module<LoadPar>(name)
|
: Module<LoadNerscPar>(name)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
// dependencies/products ///////////////////////////////////////////////////////
|
// dependencies/products ///////////////////////////////////////////////////////
|
||||||
std::vector<std::string> TLoad::getInput(void)
|
std::vector<std::string> TLoadNersc::getInput(void)
|
||||||
{
|
{
|
||||||
std::vector<std::string> in;
|
std::vector<std::string> in;
|
||||||
|
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> TLoad::getOutput(void)
|
std::vector<std::string> TLoadNersc::getOutput(void)
|
||||||
{
|
{
|
||||||
std::vector<std::string> out = {getName()};
|
std::vector<std::string> out = {getName()};
|
||||||
|
|
||||||
@ -57,13 +55,13 @@ std::vector<std::string> TLoad::getOutput(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setup ///////////////////////////////////////////////////////////////////////
|
// setup ///////////////////////////////////////////////////////////////////////
|
||||||
void TLoad::setup(void)
|
void TLoadNersc::setup(void)
|
||||||
{
|
{
|
||||||
envCreateLat(LatticeGaugeField, getName());
|
envCreateLat(LatticeGaugeField, getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
// execution ///////////////////////////////////////////////////////////////////
|
// execution ///////////////////////////////////////////////////////////////////
|
||||||
void TLoad::execute(void)
|
void TLoadNersc::execute(void)
|
||||||
{
|
{
|
||||||
FieldMetaData header;
|
FieldMetaData header;
|
||||||
std::string fileName = par().file + "."
|
std::string fileName = par().file + "."
|
@ -2,10 +2,9 @@
|
|||||||
|
|
||||||
Grid physics library, www.github.com/paboyle/Grid
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MGauge/Load.hpp
|
Source file: extras/Hadrons/Modules/MIO/LoadNersc.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
@ -26,9 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
See the full license in the file "LICENSE" in the top level distribution directory
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
*************************************************************************************/
|
*************************************************************************************/
|
||||||
/* END LEGAL */
|
/* END LEGAL */
|
||||||
|
#ifndef Hadrons_MIO_LoadNersc_hpp_
|
||||||
#ifndef Hadrons_MGauge_Load_hpp_
|
#define Hadrons_MIO_LoadNersc_hpp_
|
||||||
#define Hadrons_MGauge_Load_hpp_
|
|
||||||
|
|
||||||
#include <Grid/Hadrons/Global.hpp>
|
#include <Grid/Hadrons/Global.hpp>
|
||||||
#include <Grid/Hadrons/Module.hpp>
|
#include <Grid/Hadrons/Module.hpp>
|
||||||
@ -37,38 +35,37 @@ See the full license in the file "LICENSE" in the top level distribution directo
|
|||||||
BEGIN_HADRONS_NAMESPACE
|
BEGIN_HADRONS_NAMESPACE
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Load a NERSC configuration *
|
* Load a NERSC configuration *
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
BEGIN_MODULE_NAMESPACE(MGauge)
|
BEGIN_MODULE_NAMESPACE(MIO)
|
||||||
|
|
||||||
class LoadPar: Serializable
|
class LoadNerscPar: Serializable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
GRID_SERIALIZABLE_CLASS_MEMBERS(LoadPar,
|
GRID_SERIALIZABLE_CLASS_MEMBERS(LoadNerscPar,
|
||||||
std::string, file);
|
std::string, file);
|
||||||
};
|
};
|
||||||
|
|
||||||
class TLoad: public Module<LoadPar>
|
class TLoadNersc: public Module<LoadNerscPar>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// constructor
|
// constructor
|
||||||
TLoad(const std::string name);
|
TLoadNersc(const std::string name);
|
||||||
// destructor
|
// destructor
|
||||||
virtual ~TLoad(void) = default;
|
virtual ~TLoadNersc(void) = default;
|
||||||
// dependency relation
|
// dependency relation
|
||||||
virtual std::vector<std::string> getInput(void);
|
virtual std::vector<std::string> getInput(void);
|
||||||
virtual std::vector<std::string> getOutput(void);
|
virtual std::vector<std::string> getOutput(void);
|
||||||
protected:
|
|
||||||
// setup
|
// setup
|
||||||
virtual void setup(void);
|
virtual void setup(void);
|
||||||
// execution
|
// execution
|
||||||
virtual void execute(void);
|
virtual void execute(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_REGISTER_NS(Load, TLoad, MGauge);
|
MODULE_REGISTER_NS(LoadNersc, TLoadNersc, MIO);
|
||||||
|
|
||||||
END_MODULE_NAMESPACE
|
END_MODULE_NAMESPACE
|
||||||
|
|
||||||
END_HADRONS_NAMESPACE
|
END_HADRONS_NAMESPACE
|
||||||
|
|
||||||
#endif // Hadrons_MGauge_Load_hpp_
|
#endif // Hadrons_MIO_LoadNersc_hpp_
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MLoop/NoiseLoop.hpp
|
Source file: extras/Hadrons/Modules/MLoop/NoiseLoop.hpp
|
||||||
|
|
||||||
Copyright (C) 2016
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,3 +1,31 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MScalar/ChargedProp.cc
|
||||||
|
|
||||||
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: James Harrison <jch1g10@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/MScalar/ChargedProp.hpp>
|
#include <Grid/Hadrons/Modules/MScalar/ChargedProp.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MScalar/Scalar.hpp>
|
#include <Grid/Hadrons/Modules/MScalar/Scalar.hpp>
|
||||||
|
|
||||||
@ -105,7 +133,7 @@ void TChargedProp::execute(void)
|
|||||||
LOG(Message) << "Saving zero-momentum projection to '"
|
LOG(Message) << "Saving zero-momentum projection to '"
|
||||||
<< filename << "'..." << std::endl;
|
<< filename << "'..." << std::endl;
|
||||||
|
|
||||||
CorrWriter writer(filename);
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
std::vector<TComplex> vecBuf;
|
std::vector<TComplex> vecBuf;
|
||||||
std::vector<Complex> result;
|
std::vector<Complex> result;
|
||||||
|
|
||||||
|
@ -1,3 +1,30 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MScalar/ChargedProp.hpp
|
||||||
|
|
||||||
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
#ifndef Hadrons_MScalar_ChargedProp_hpp_
|
#ifndef Hadrons_MScalar_ChargedProp_hpp_
|
||||||
#define Hadrons_MScalar_ChargedProp_hpp_
|
#define Hadrons_MScalar_ChargedProp_hpp_
|
||||||
|
|
||||||
|
@ -1,3 +1,30 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MScalar/FreeProp.cc
|
||||||
|
|
||||||
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
#include <Grid/Hadrons/Modules/MScalar/FreeProp.hpp>
|
#include <Grid/Hadrons/Modules/MScalar/FreeProp.hpp>
|
||||||
#include <Grid/Hadrons/Modules/MScalar/Scalar.hpp>
|
#include <Grid/Hadrons/Modules/MScalar/Scalar.hpp>
|
||||||
|
|
||||||
|
@ -1,3 +1,30 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MScalar/FreeProp.hpp
|
||||||
|
|
||||||
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
#ifndef Hadrons_MScalar_FreeProp_hpp_
|
#ifndef Hadrons_MScalar_FreeProp_hpp_
|
||||||
#define Hadrons_MScalar_FreeProp_hpp_
|
#define Hadrons_MScalar_FreeProp_hpp_
|
||||||
|
|
||||||
|
@ -1,3 +1,30 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MScalar/Scalar.hpp
|
||||||
|
|
||||||
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
#ifndef Hadrons_Scalar_hpp_
|
#ifndef Hadrons_Scalar_hpp_
|
||||||
#define Hadrons_Scalar_hpp_
|
#define Hadrons_Scalar_hpp_
|
||||||
|
|
||||||
|
166
extras/Hadrons/Modules/MScalarSUN/Div.hpp
Normal file
166
extras/Hadrons/Modules/MScalarSUN/Div.hpp
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MScalarSUN/Div.hpp
|
||||||
|
|
||||||
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
|
#ifndef Hadrons_MScalarSUN_Div_hpp_
|
||||||
|
#define Hadrons_MScalarSUN_Div_hpp_
|
||||||
|
|
||||||
|
#include <Grid/Hadrons/Global.hpp>
|
||||||
|
#include <Grid/Hadrons/Module.hpp>
|
||||||
|
#include <Grid/Hadrons/ModuleFactory.hpp>
|
||||||
|
|
||||||
|
BEGIN_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Div *
|
||||||
|
******************************************************************************/
|
||||||
|
BEGIN_MODULE_NAMESPACE(MScalarSUN)
|
||||||
|
|
||||||
|
class DivPar: Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRID_SERIALIZABLE_ENUM(DiffType, undef, forward, 1, backward, 2, central, 3);
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(DivPar,
|
||||||
|
std::vector<std::string>, op,
|
||||||
|
DiffType, type,
|
||||||
|
std::string, output);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename SImpl>
|
||||||
|
class TDiv: public Module<DivPar>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef typename SImpl::Field Field;
|
||||||
|
typedef typename SImpl::ComplexField ComplexField;
|
||||||
|
class Result: Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(Result,
|
||||||
|
DivPar::DiffType, type,
|
||||||
|
Complex, value);
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
// constructor
|
||||||
|
TDiv(const std::string name);
|
||||||
|
// destructor
|
||||||
|
virtual ~TDiv(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(DivSU2, TDiv<ScalarNxNAdjImplR<2>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(DivSU3, TDiv<ScalarNxNAdjImplR<3>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(DivSU4, TDiv<ScalarNxNAdjImplR<4>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(DivSU5, TDiv<ScalarNxNAdjImplR<5>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(DivSU6, TDiv<ScalarNxNAdjImplR<6>>, MScalarSUN);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* TDiv implementation *
|
||||||
|
******************************************************************************/
|
||||||
|
// constructor /////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
TDiv<SImpl>::TDiv(const std::string name)
|
||||||
|
: Module<DivPar>(name)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// dependencies/products ///////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
std::vector<std::string> TDiv<SImpl>::getInput(void)
|
||||||
|
{
|
||||||
|
return par().op;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename SImpl>
|
||||||
|
std::vector<std::string> TDiv<SImpl>::getOutput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> out = {getName()};
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup ///////////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
void TDiv<SImpl>::setup(void)
|
||||||
|
{
|
||||||
|
if (par().op.size() != env().getNd())
|
||||||
|
{
|
||||||
|
HADRON_ERROR(Size, "the number of components differs from number of dimensions");
|
||||||
|
}
|
||||||
|
envCreateLat(ComplexField, getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// execution ///////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
void TDiv<SImpl>::execute(void)
|
||||||
|
{
|
||||||
|
const auto nd = env().getNd();
|
||||||
|
|
||||||
|
LOG(Message) << "Computing the " << par().type << " divergence of [";
|
||||||
|
for (unsigned int mu = 0; mu < nd; ++mu)
|
||||||
|
{
|
||||||
|
std::cout << par().op[mu] << ((mu == nd - 1) ? "]" : ", ");
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
auto &div = envGet(ComplexField, getName());
|
||||||
|
div = zero;
|
||||||
|
for (unsigned int mu = 0; mu < nd; ++mu)
|
||||||
|
{
|
||||||
|
auto &op = envGet(ComplexField, par().op[mu]);
|
||||||
|
switch(par().type)
|
||||||
|
{
|
||||||
|
case DivPar::DiffType::backward:
|
||||||
|
div += op - Cshift(op, mu, -1);
|
||||||
|
break;
|
||||||
|
case DivPar::DiffType::forward:
|
||||||
|
div += Cshift(op, mu, 1) - op;
|
||||||
|
break;
|
||||||
|
case DivPar::DiffType::central:
|
||||||
|
div += 0.5*(Cshift(op, mu, 1) - Cshift(op, mu, -1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!par().output.empty())
|
||||||
|
{
|
||||||
|
Result r;
|
||||||
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
|
|
||||||
|
r.type = par().type;
|
||||||
|
r.value = TensorRemove(sum(div));
|
||||||
|
write(writer, "div", r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
END_MODULE_NAMESPACE
|
||||||
|
|
||||||
|
END_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
#endif // Hadrons_MScalarSUN_Div_hpp_
|
146
extras/Hadrons/Modules/MScalarSUN/TrMag.hpp
Normal file
146
extras/Hadrons/Modules/MScalarSUN/TrMag.hpp
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MScalarSUN/TrMag.hpp
|
||||||
|
|
||||||
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
|
#ifndef Hadrons_MScalarSUN_TrMag_hpp_
|
||||||
|
#define Hadrons_MScalarSUN_TrMag_hpp_
|
||||||
|
|
||||||
|
#include <Grid/Hadrons/Global.hpp>
|
||||||
|
#include <Grid/Hadrons/Module.hpp>
|
||||||
|
#include <Grid/Hadrons/ModuleFactory.hpp>
|
||||||
|
|
||||||
|
BEGIN_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Module to compute tr(mag^n) *
|
||||||
|
******************************************************************************/
|
||||||
|
BEGIN_MODULE_NAMESPACE(MScalarSUN)
|
||||||
|
|
||||||
|
class TrMagPar: Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(TrMagPar,
|
||||||
|
std::string, field,
|
||||||
|
unsigned int, maxPow,
|
||||||
|
std::string, output);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename SImpl>
|
||||||
|
class TTrMag: public Module<TrMagPar>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef typename SImpl::Field Field;
|
||||||
|
typedef typename SImpl::ComplexField ComplexField;
|
||||||
|
class Result: Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(Result,
|
||||||
|
std::string, op,
|
||||||
|
Real, value);
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
// constructor
|
||||||
|
TTrMag(const std::string name);
|
||||||
|
// destructor
|
||||||
|
virtual ~TTrMag(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(TrMagSU2, TTrMag<ScalarNxNAdjImplR<2>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TrMagSU3, TTrMag<ScalarNxNAdjImplR<3>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TrMagSU4, TTrMag<ScalarNxNAdjImplR<4>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TrMagSU5, TTrMag<ScalarNxNAdjImplR<5>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TrMagSU6, TTrMag<ScalarNxNAdjImplR<6>>, MScalarSUN);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* TTrMag implementation *
|
||||||
|
******************************************************************************/
|
||||||
|
// constructor /////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
TTrMag<SImpl>::TTrMag(const std::string name)
|
||||||
|
: Module<TrMagPar>(name)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// dependencies/products ///////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
std::vector<std::string> TTrMag<SImpl>::getInput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> in = {par().field};
|
||||||
|
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename SImpl>
|
||||||
|
std::vector<std::string> TTrMag<SImpl>::getOutput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> out = {};
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup ///////////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
void TTrMag<SImpl>::setup(void)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// execution ///////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
void TTrMag<SImpl>::execute(void)
|
||||||
|
{
|
||||||
|
LOG(Message) << "Computing tr(mag^n) for n even up to " << par().maxPow
|
||||||
|
<< "..." << std::endl;
|
||||||
|
|
||||||
|
std::vector<Result> result;
|
||||||
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
|
auto &phi = envGet(Field, par().field);
|
||||||
|
|
||||||
|
auto m2 = sum(phi), mn = m2;
|
||||||
|
|
||||||
|
m2 = -m2*m2;
|
||||||
|
mn = 1.;
|
||||||
|
for (unsigned int n = 2; n <= par().maxPow; n += 2)
|
||||||
|
{
|
||||||
|
Result r;
|
||||||
|
|
||||||
|
mn = mn*m2;
|
||||||
|
r.op = "tr(mag^" + std::to_string(n) + ")";
|
||||||
|
r.value = TensorRemove(trace(mn)).real();
|
||||||
|
result.push_back(r);
|
||||||
|
}
|
||||||
|
write(writer, "trmag", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
END_MODULE_NAMESPACE
|
||||||
|
|
||||||
|
END_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
#endif // Hadrons_MScalarSUN_TrMag_hpp_
|
182
extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp
Normal file
182
extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp
|
||||||
|
|
||||||
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
|
#ifndef Hadrons_MScalarSUN_TrPhi_hpp_
|
||||||
|
#define Hadrons_MScalarSUN_TrPhi_hpp_
|
||||||
|
|
||||||
|
#include <Grid/Hadrons/Global.hpp>
|
||||||
|
#include <Grid/Hadrons/Module.hpp>
|
||||||
|
#include <Grid/Hadrons/ModuleFactory.hpp>
|
||||||
|
|
||||||
|
BEGIN_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Module to compute tr(phi^n) *
|
||||||
|
******************************************************************************/
|
||||||
|
BEGIN_MODULE_NAMESPACE(MScalarSUN)
|
||||||
|
|
||||||
|
class TrPhiPar: Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(TrPhiPar,
|
||||||
|
std::string, field,
|
||||||
|
unsigned int, maxPow,
|
||||||
|
std::string, output);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename SImpl>
|
||||||
|
class TTrPhi: public Module<TrPhiPar>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef typename SImpl::Field Field;
|
||||||
|
typedef typename SImpl::ComplexField ComplexField;
|
||||||
|
class Result: Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(Result,
|
||||||
|
std::string, op,
|
||||||
|
Real, value);
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
// constructor
|
||||||
|
TTrPhi(const std::string name);
|
||||||
|
// destructor
|
||||||
|
virtual ~TTrPhi(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);
|
||||||
|
private:
|
||||||
|
// output name generator
|
||||||
|
std::string outName(const unsigned int n);
|
||||||
|
};
|
||||||
|
|
||||||
|
MODULE_REGISTER_NS(TrPhiSU2, TTrPhi<ScalarNxNAdjImplR<2>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TrPhiSU3, TTrPhi<ScalarNxNAdjImplR<3>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TrPhiSU4, TTrPhi<ScalarNxNAdjImplR<4>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TrPhiSU5, TTrPhi<ScalarNxNAdjImplR<5>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TrPhiSU6, TTrPhi<ScalarNxNAdjImplR<6>>, MScalarSUN);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* TTrPhi implementation *
|
||||||
|
******************************************************************************/
|
||||||
|
// constructor /////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
TTrPhi<SImpl>::TTrPhi(const std::string name)
|
||||||
|
: Module<TrPhiPar>(name)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// dependencies/products ///////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
std::vector<std::string> TTrPhi<SImpl>::getInput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> in = {par().field};
|
||||||
|
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename SImpl>
|
||||||
|
std::vector<std::string> TTrPhi<SImpl>::getOutput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> out;
|
||||||
|
|
||||||
|
for (unsigned int n = 2; n <= par().maxPow; n += 2)
|
||||||
|
{
|
||||||
|
out.push_back(outName(n));
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup ///////////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
void TTrPhi<SImpl>::setup(void)
|
||||||
|
{
|
||||||
|
if (par().maxPow < 2)
|
||||||
|
{
|
||||||
|
HADRON_ERROR(Size, "'maxPow' should be at least equal to 2");
|
||||||
|
}
|
||||||
|
envTmpLat(Field, "phi2");
|
||||||
|
envTmpLat(Field, "buf");
|
||||||
|
for (unsigned int n = 2; n <= par().maxPow; n += 2)
|
||||||
|
{
|
||||||
|
envCreateLat(ComplexField, outName(n));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// execution ///////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
void TTrPhi<SImpl>::execute(void)
|
||||||
|
{
|
||||||
|
LOG(Message) << "Computing tr(phi^n) for n even up to " << par().maxPow
|
||||||
|
<< "..." << std::endl;
|
||||||
|
|
||||||
|
std::vector<Result> result;
|
||||||
|
auto &phi = envGet(Field, par().field);
|
||||||
|
|
||||||
|
envGetTmp(Field, phi2);
|
||||||
|
envGetTmp(Field, buf);
|
||||||
|
buf = 1.;
|
||||||
|
phi2 = -phi*phi;
|
||||||
|
for (unsigned int n = 2; n <= par().maxPow; n += 2)
|
||||||
|
{
|
||||||
|
auto &phin = envGet(ComplexField, outName(n));
|
||||||
|
|
||||||
|
buf = buf*phi2;
|
||||||
|
phin = trace(buf);
|
||||||
|
if (!par().output.empty())
|
||||||
|
{
|
||||||
|
Result r;
|
||||||
|
|
||||||
|
r.op = "tr(phi^" + std::to_string(n) + ")";
|
||||||
|
r.value = TensorRemove(sum(phin)).real();
|
||||||
|
result.push_back(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (result.size() > 0)
|
||||||
|
{
|
||||||
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
|
|
||||||
|
write(writer, "trphi", result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// output name generator ///////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
std::string TTrPhi<SImpl>::outName(const unsigned int n)
|
||||||
|
{
|
||||||
|
return getName() + "_" + std::to_string(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
END_MODULE_NAMESPACE
|
||||||
|
|
||||||
|
END_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
#endif // Hadrons_MScalarSUN_TrPhi_hpp_
|
184
extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp
Normal file
184
extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp
|
||||||
|
|
||||||
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
|
#ifndef Hadrons_MScalarSUN_TwoPoint_hpp_
|
||||||
|
#define Hadrons_MScalarSUN_TwoPoint_hpp_
|
||||||
|
|
||||||
|
#include <Grid/Hadrons/Global.hpp>
|
||||||
|
#include <Grid/Hadrons/Module.hpp>
|
||||||
|
#include <Grid/Hadrons/ModuleFactory.hpp>
|
||||||
|
|
||||||
|
BEGIN_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* 2-pt functions for a given set of operators *
|
||||||
|
******************************************************************************/
|
||||||
|
BEGIN_MODULE_NAMESPACE(MScalarSUN)
|
||||||
|
|
||||||
|
class TwoPointPar: Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(TwoPointPar,
|
||||||
|
std::vector<std::string>, op,
|
||||||
|
std::string, output);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename SImpl>
|
||||||
|
class TTwoPoint: public Module<TwoPointPar>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef typename SImpl::Field Field;
|
||||||
|
typedef typename SImpl::ComplexField ComplexField;
|
||||||
|
class Result: Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(Result,
|
||||||
|
std::string, sink,
|
||||||
|
std::string, source,
|
||||||
|
std::vector<Complex>, data);
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
// constructor
|
||||||
|
TTwoPoint(const std::string name);
|
||||||
|
// destructor
|
||||||
|
virtual ~TTwoPoint(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);
|
||||||
|
private:
|
||||||
|
// make 2-pt function
|
||||||
|
template <class SinkSite, class SourceSite>
|
||||||
|
std::vector<Complex> makeTwoPoint(const std::vector<SinkSite> &sink,
|
||||||
|
const std::vector<SourceSite> &source);
|
||||||
|
};
|
||||||
|
|
||||||
|
MODULE_REGISTER_NS(TwoPointSU2, TTwoPoint<ScalarNxNAdjImplR<2>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TwoPointSU3, TTwoPoint<ScalarNxNAdjImplR<3>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TwoPointSU4, TTwoPoint<ScalarNxNAdjImplR<4>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TwoPointSU5, TTwoPoint<ScalarNxNAdjImplR<5>>, MScalarSUN);
|
||||||
|
MODULE_REGISTER_NS(TwoPointSU6, TTwoPoint<ScalarNxNAdjImplR<6>>, MScalarSUN);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* TTwoPoint implementation *
|
||||||
|
******************************************************************************/
|
||||||
|
// constructor /////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
TTwoPoint<SImpl>::TTwoPoint(const std::string name)
|
||||||
|
: Module<TwoPointPar>(name)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// dependencies/products ///////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
std::vector<std::string> TTwoPoint<SImpl>::getInput(void)
|
||||||
|
{
|
||||||
|
return par().op;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename SImpl>
|
||||||
|
std::vector<std::string> TTwoPoint<SImpl>::getOutput(void)
|
||||||
|
{
|
||||||
|
std::vector<std::string> out = {};
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup ///////////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
void TTwoPoint<SImpl>::setup(void)
|
||||||
|
{
|
||||||
|
const unsigned int nt = env().getDim().back();
|
||||||
|
envTmp(std::vector<std::vector<TComplex>>, "slicedOp", 1, par().op.size(),
|
||||||
|
std::vector<TComplex>(nt));
|
||||||
|
}
|
||||||
|
|
||||||
|
// execution ///////////////////////////////////////////////////////////////////
|
||||||
|
template <typename SImpl>
|
||||||
|
void TTwoPoint<SImpl>::execute(void)
|
||||||
|
{
|
||||||
|
LOG(Message) << "Computing 2-point functions for operators:" << std::endl;
|
||||||
|
for (auto &o: par().op)
|
||||||
|
{
|
||||||
|
LOG(Message) << " '" << o << "'" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultWriter writer(RESULT_FILE_NAME(par().output));
|
||||||
|
const unsigned int nd = env().getDim().size();
|
||||||
|
std::vector<Result> result;
|
||||||
|
|
||||||
|
envGetTmp(std::vector<std::vector<TComplex>>, slicedOp);
|
||||||
|
for (unsigned int i = 0; i < par().op.size(); ++i)
|
||||||
|
{
|
||||||
|
auto &op = envGet(ComplexField, par().op[i]);
|
||||||
|
|
||||||
|
sliceSum(op, slicedOp[i], nd - 1);
|
||||||
|
}
|
||||||
|
for (unsigned int i = 0; i < par().op.size(); ++i)
|
||||||
|
for (unsigned int j = 0; j < par().op.size(); ++j)
|
||||||
|
{
|
||||||
|
Result r;
|
||||||
|
|
||||||
|
r.sink = par().op[i];
|
||||||
|
r.source = par().op[j];
|
||||||
|
r.data = makeTwoPoint(slicedOp[i], slicedOp[j]);
|
||||||
|
result.push_back(r);
|
||||||
|
}
|
||||||
|
write(writer, "twopt", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make 2-pt function //////////////////////////////////////////////////////////
|
||||||
|
template <class SImpl>
|
||||||
|
template <class SinkSite, class SourceSite>
|
||||||
|
std::vector<Complex> TTwoPoint<SImpl>::makeTwoPoint(
|
||||||
|
const std::vector<SinkSite> &sink,
|
||||||
|
const std::vector<SourceSite> &source)
|
||||||
|
{
|
||||||
|
assert(sink.size() == source.size());
|
||||||
|
|
||||||
|
unsigned int nt = sink.size();
|
||||||
|
std::vector<Complex> res(nt, 0.);
|
||||||
|
|
||||||
|
for (unsigned int dt = 0; dt < nt; ++dt)
|
||||||
|
{
|
||||||
|
for (unsigned int t = 0; t < nt; ++t)
|
||||||
|
{
|
||||||
|
res[dt] += TensorRemove(trace(sink[(t+dt)%nt]*source[t]));
|
||||||
|
}
|
||||||
|
res[dt] *= 1./static_cast<double>(nt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
END_MODULE_NAMESPACE
|
||||||
|
|
||||||
|
END_HADRONS_NAMESPACE
|
||||||
|
|
||||||
|
#endif // Hadrons_MScalarSUN_TwoPoint_hpp_
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MSink/Point.hpp
|
Source file: extras/Hadrons/Modules/MSink/Point.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MSink/Smear.hpp
|
Source file: extras/Hadrons/Modules/MSink/Smear.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MSolver/RBPrecCG.hpp
|
Source file: extras/Hadrons/Modules/MSolver/RBPrecCG.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MSource/Point.hpp
|
Source file: extras/Hadrons/Modules/MSource/Point.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -2,11 +2,12 @@
|
|||||||
|
|
||||||
Grid physics library, www.github.com/paboyle/Grid
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MContraction/SeqConserved.hpp
|
Source file: extras/Hadrons/Modules/MSource/SeqConserved.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,11 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MSource/SeqGamma.hpp
|
Source file: extras/Hadrons/Modules/MSource/SeqGamma.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
Copyright (C) 2017
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MSource/Wall.hpp
|
Source file: extras/Hadrons/Modules/MSource/Wall.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MSource/Z2.hpp
|
Source file: extras/Hadrons/Modules/MSource/Z2.hpp
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015-2018
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp
|
Source file: extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp
|
Source file: extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Andrew Lawson <andrew.lawson1991@gmail.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
Author: Lanny91 <andrew.lawson@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -4,7 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/VirtualMachine.cc
|
Source file: extras/Hadrons/VirtualMachine.cc
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid
|
|||||||
|
|
||||||
Source file: extras/Hadrons/VirtualMachine.hpp
|
Source file: extras/Hadrons/VirtualMachine.hpp
|
||||||
|
|
||||||
Copyright (C) 2017
|
Copyright (C) 2015-2018
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
Author: Antonin Portelli <antonin.portelli@me.com>
|
||||||
|
|
||||||
|
@ -7,36 +7,6 @@ echo 'modules_hpp =\' >> modules.inc
|
|||||||
find Modules -name '*.hpp' -type f -print | sed 's/^/ /;$q;s/$/ \\/' >> modules.inc
|
find Modules -name '*.hpp' -type f -print | sed 's/^/ /;$q;s/$/ \\/' >> modules.inc
|
||||||
echo '' >> modules.inc
|
echo '' >> modules.inc
|
||||||
rm -f Modules.hpp
|
rm -f Modules.hpp
|
||||||
echo "/*************************************************************************************
|
|
||||||
|
|
||||||
Grid physics library, www.github.com/paboyle/Grid
|
|
||||||
|
|
||||||
Source file: extras/Hadrons/Modules.hpp
|
|
||||||
|
|
||||||
Copyright (C) 2015
|
|
||||||
Copyright (C) 2016
|
|
||||||
Copyright (C) 2017
|
|
||||||
|
|
||||||
Author: Antonin Portelli <antonin.portelli@me.com>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
|
|
||||||
See the full license in the file \"LICENSE\" in the top level distribution directory
|
|
||||||
*************************************************************************************/
|
|
||||||
/* END LEGAL */
|
|
||||||
" > Modules.hpp
|
|
||||||
for f in `find Modules -name '*.hpp'`; do
|
for f in `find Modules -name '*.hpp'`; do
|
||||||
echo "#include <Grid/Hadrons/${f}>" >> Modules.hpp
|
echo "#include <Grid/Hadrons/${f}>" >> Modules.hpp
|
||||||
done
|
done
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
modules_cc =\
|
modules_cc =\
|
||||||
|
Modules/MScalar/ChargedProp.cc \
|
||||||
|
Modules/MScalar/FreeProp.cc \
|
||||||
Modules/MContraction/WeakHamiltonianEye.cc \
|
Modules/MContraction/WeakHamiltonianEye.cc \
|
||||||
Modules/MContraction/WeakNeutral4ptDisc.cc \
|
Modules/MContraction/WeakNeutral4ptDisc.cc \
|
||||||
Modules/MContraction/WeakHamiltonianNonEye.cc \
|
Modules/MContraction/WeakHamiltonianNonEye.cc \
|
||||||
Modules/MGauge/Load.cc \
|
|
||||||
Modules/MGauge/Unit.cc \
|
Modules/MGauge/Unit.cc \
|
||||||
Modules/MGauge/StochEm.cc \
|
Modules/MGauge/StochEm.cc \
|
||||||
Modules/MGauge/Random.cc \
|
Modules/MGauge/Random.cc \
|
||||||
|
Modules/MGauge/FundtoHirep.cc \
|
||||||
Modules/MScalar/FreeProp.cc \
|
Modules/MScalar/FreeProp.cc \
|
||||||
Modules/MScalar/ChargedProp.cc
|
Modules/MScalar/ChargedProp.cc \
|
||||||
|
Modules/MIO/LoadNersc.cc
|
||||||
|
|
||||||
modules_hpp =\
|
modules_hpp =\
|
||||||
Modules/MContraction/Baryon.hpp \
|
Modules/MContraction/Baryon.hpp \
|
||||||
@ -28,10 +31,10 @@ modules_hpp =\
|
|||||||
Modules/MSink/Smear.hpp \
|
Modules/MSink/Smear.hpp \
|
||||||
Modules/MSink/Point.hpp \
|
Modules/MSink/Point.hpp \
|
||||||
Modules/MSolver/RBPrecCG.hpp \
|
Modules/MSolver/RBPrecCG.hpp \
|
||||||
Modules/MGauge/Load.hpp \
|
|
||||||
Modules/MGauge/Unit.hpp \
|
Modules/MGauge/Unit.hpp \
|
||||||
Modules/MGauge/Random.hpp \
|
Modules/MGauge/Random.hpp \
|
||||||
Modules/MGauge/StochEm.hpp \
|
Modules/MGauge/StochEm.hpp \
|
||||||
|
Modules/MGauge/FundtoHirep.hpp \
|
||||||
Modules/MUtilities/TestSeqGamma.hpp \
|
Modules/MUtilities/TestSeqGamma.hpp \
|
||||||
Modules/MUtilities/TestSeqConserved.hpp \
|
Modules/MUtilities/TestSeqConserved.hpp \
|
||||||
Modules/MLoop/NoiseLoop.hpp \
|
Modules/MLoop/NoiseLoop.hpp \
|
||||||
@ -39,5 +42,12 @@ modules_hpp =\
|
|||||||
Modules/MScalar/Scalar.hpp \
|
Modules/MScalar/Scalar.hpp \
|
||||||
Modules/MScalar/ChargedProp.hpp \
|
Modules/MScalar/ChargedProp.hpp \
|
||||||
Modules/MAction/DWF.hpp \
|
Modules/MAction/DWF.hpp \
|
||||||
Modules/MAction/Wilson.hpp
|
Modules/MAction/Wilson.hpp \
|
||||||
|
Modules/MAction/WilsonClover.hpp \
|
||||||
|
Modules/MScalarSUN/Div.hpp \
|
||||||
|
Modules/MScalarSUN/TrMag.hpp \
|
||||||
|
Modules/MScalarSUN/TwoPoint.hpp \
|
||||||
|
Modules/MScalarSUN/TrPhi.hpp \
|
||||||
|
Modules/MIO/LoadNersc.hpp \
|
||||||
|
Modules/MIO/LoadBinary.hpp
|
||||||
|
|
||||||
|
@ -183,11 +183,13 @@ namespace Grid {
|
|||||||
virtual RealD Mpc (const Field &in, Field &out) =0;
|
virtual RealD Mpc (const Field &in, Field &out) =0;
|
||||||
virtual RealD MpcDag (const Field &in, Field &out) =0;
|
virtual RealD MpcDag (const Field &in, Field &out) =0;
|
||||||
virtual void MpcDagMpc(const Field &in, Field &out,RealD &ni,RealD &no) {
|
virtual void MpcDagMpc(const Field &in, Field &out,RealD &ni,RealD &no) {
|
||||||
Field tmp(in._grid);
|
Field tmp(in._grid);
|
||||||
|
tmp.checkerboard = in.checkerboard;
|
||||||
ni=Mpc(in,tmp);
|
ni=Mpc(in,tmp);
|
||||||
no=MpcDag(tmp,out);
|
no=MpcDag(tmp,out);
|
||||||
}
|
}
|
||||||
virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){
|
virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){
|
||||||
|
out.checkerboard = in.checkerboard;
|
||||||
MpcDagMpc(in,out,n1,n2);
|
MpcDagMpc(in,out,n1,n2);
|
||||||
}
|
}
|
||||||
virtual void HermOp(const Field &in, Field &out){
|
virtual void HermOp(const Field &in, Field &out){
|
||||||
@ -215,13 +217,15 @@ namespace Grid {
|
|||||||
public:
|
public:
|
||||||
SchurDiagMooeeOperator (Matrix &Mat): _Mat(Mat){};
|
SchurDiagMooeeOperator (Matrix &Mat): _Mat(Mat){};
|
||||||
virtual RealD Mpc (const Field &in, Field &out) {
|
virtual RealD Mpc (const Field &in, Field &out) {
|
||||||
Field tmp(in._grid);
|
Field tmp(in._grid);
|
||||||
// std::cout <<"grid pointers: in._grid="<< in._grid << " out._grid=" << out._grid << " _Mat.Grid=" << _Mat.Grid() << " _Mat.RedBlackGrid=" << _Mat.RedBlackGrid() << std::endl;
|
tmp.checkerboard = !in.checkerboard;
|
||||||
|
//std::cout <<"grid pointers: in._grid="<< in._grid << " out._grid=" << out._grid << " _Mat.Grid=" << _Mat.Grid() << " _Mat.RedBlackGrid=" << _Mat.RedBlackGrid() << std::endl;
|
||||||
|
|
||||||
_Mat.Meooe(in,tmp);
|
_Mat.Meooe(in,tmp);
|
||||||
_Mat.MooeeInv(tmp,out);
|
_Mat.MooeeInv(tmp,out);
|
||||||
_Mat.Meooe(out,tmp);
|
_Mat.Meooe(out,tmp);
|
||||||
|
|
||||||
|
//std::cout << "cb in " << in.checkerboard << " cb out " << out.checkerboard << std::endl;
|
||||||
_Mat.Mooee(in,out);
|
_Mat.Mooee(in,out);
|
||||||
return axpy_norm(out,-1.0,tmp,out);
|
return axpy_norm(out,-1.0,tmp,out);
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,7 @@ public:
|
|||||||
|
|
||||||
virtual ~GridBase() = default;
|
virtual ~GridBase() = default;
|
||||||
|
|
||||||
|
|
||||||
// Physics Grid information.
|
// Physics Grid information.
|
||||||
std::vector<int> _simd_layout;// Which dimensions get relayed out over simd lanes.
|
std::vector<int> _simd_layout;// Which dimensions get relayed out over simd lanes.
|
||||||
std::vector<int> _fdimensions;// (full) Global dimensions of array prior to cb removal
|
std::vector<int> _fdimensions;// (full) Global dimensions of array prior to cb removal
|
||||||
@ -78,6 +79,8 @@ public:
|
|||||||
std::vector<int> _lstart; // local start of array in gcoors _processor_coor[d]*_ldimensions[d]
|
std::vector<int> _lstart; // local start of array in gcoors _processor_coor[d]*_ldimensions[d]
|
||||||
std::vector<int> _lend ; // local end of array in gcoors _processor_coor[d]*_ldimensions[d]+_ldimensions_[d]-1
|
std::vector<int> _lend ; // local end of array in gcoors _processor_coor[d]*_ldimensions[d]+_ldimensions_[d]-1
|
||||||
|
|
||||||
|
bool _isCheckerBoarded;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
@ -97,6 +97,7 @@ public:
|
|||||||
///////////////////////
|
///////////////////////
|
||||||
// Grid information
|
// Grid information
|
||||||
///////////////////////
|
///////////////////////
|
||||||
|
_isCheckerBoarded = false;
|
||||||
_ndimension = dimensions.size();
|
_ndimension = dimensions.size();
|
||||||
|
|
||||||
_fdimensions.resize(_ndimension);
|
_fdimensions.resize(_ndimension);
|
||||||
@ -122,6 +123,7 @@ public:
|
|||||||
|
|
||||||
// Use a reduced simd grid
|
// Use a reduced simd grid
|
||||||
_ldimensions[d] = _gdimensions[d] / _processors[d]; //local dimensions
|
_ldimensions[d] = _gdimensions[d] / _processors[d]; //local dimensions
|
||||||
|
//std::cout << _ldimensions[d] << " " << _gdimensions[d] << " " << _processors[d] << std::endl;
|
||||||
assert(_ldimensions[d] * _processors[d] == _gdimensions[d]);
|
assert(_ldimensions[d] * _processors[d] == _gdimensions[d]);
|
||||||
|
|
||||||
_rdimensions[d] = _ldimensions[d] / _simd_layout[d]; //overdecomposition
|
_rdimensions[d] = _ldimensions[d] / _simd_layout[d]; //overdecomposition
|
||||||
@ -166,6 +168,7 @@ public:
|
|||||||
block = block * _rdimensions[d];
|
block = block * _rdimensions[d];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -171,9 +171,8 @@ public:
|
|||||||
const std::vector<int> &checker_dim_mask,
|
const std::vector<int> &checker_dim_mask,
|
||||||
int checker_dim)
|
int checker_dim)
|
||||||
{
|
{
|
||||||
///////////////////////
|
|
||||||
// Grid information
|
_isCheckerBoarded = true;
|
||||||
///////////////////////
|
|
||||||
_checker_dim = checker_dim;
|
_checker_dim = checker_dim;
|
||||||
assert(checker_dim_mask[checker_dim] == 1);
|
assert(checker_dim_mask[checker_dim] == 1);
|
||||||
_ndimension = dimensions.size();
|
_ndimension = dimensions.size();
|
||||||
|
@ -83,6 +83,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Wraps MPI_Cart routines, or implements equivalent on other impls
|
// Wraps MPI_Cart routines, or implements equivalent on other impls
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -86,6 +86,7 @@ protected:
|
|||||||
Colours &Painter;
|
Colours &Painter;
|
||||||
int active;
|
int active;
|
||||||
int timing_mode;
|
int timing_mode;
|
||||||
|
int topWidth{-1};
|
||||||
static int timestamp;
|
static int timestamp;
|
||||||
std::string name, topName;
|
std::string name, topName;
|
||||||
std::string COLOUR;
|
std::string COLOUR;
|
||||||
@ -124,11 +125,17 @@ public:
|
|||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void setTopWidth(const int w) {topWidth = w;}
|
||||||
|
|
||||||
friend std::ostream& operator<< (std::ostream& stream, Logger& log){
|
friend std::ostream& operator<< (std::ostream& stream, Logger& log){
|
||||||
|
|
||||||
if ( log.active ) {
|
if ( log.active ) {
|
||||||
stream << log.background()<< std::left << log.topName << log.background()<< " : ";
|
stream << log.background()<< std::left;
|
||||||
|
if (log.topWidth > 0)
|
||||||
|
{
|
||||||
|
stream << std::setw(log.topWidth);
|
||||||
|
}
|
||||||
|
stream << log.topName << log.background()<< " : ";
|
||||||
stream << log.colour() << std::left << log.name << log.background() << " : ";
|
stream << log.colour() << std::left << log.name << log.background() << " : ";
|
||||||
if ( log.timestamp ) {
|
if ( log.timestamp ) {
|
||||||
log.StopWatch->Stop();
|
log.StopWatch->Stop();
|
||||||
|
@ -39,6 +39,7 @@ namespace QCD {
|
|||||||
static const int Zdir = 2;
|
static const int Zdir = 2;
|
||||||
static const int Tdir = 3;
|
static const int Tdir = 3;
|
||||||
|
|
||||||
|
|
||||||
static const int Xp = 0;
|
static const int Xp = 0;
|
||||||
static const int Yp = 1;
|
static const int Yp = 1;
|
||||||
static const int Zp = 2;
|
static const int Zp = 2;
|
||||||
@ -420,15 +421,16 @@ namespace QCD {
|
|||||||
//////////////////////////////////////////////
|
//////////////////////////////////////////////
|
||||||
// Fermion <-> propagator assignements
|
// Fermion <-> propagator assignements
|
||||||
//////////////////////////////////////////////
|
//////////////////////////////////////////////
|
||||||
template <class Prop, class Ferm>
|
//template <class Prop, class Ferm>
|
||||||
void FermToProp(Prop &p, const Ferm &f, const int s, const int c)
|
template <class Fimpl>
|
||||||
|
void FermToProp(typename Fimpl::PropagatorField &p, const typename Fimpl::FermionField &f, const int s, const int c)
|
||||||
{
|
{
|
||||||
for(int j = 0; j < Ns; ++j)
|
for(int j = 0; j < Ns; ++j)
|
||||||
{
|
{
|
||||||
auto pjs = peekSpin(p, j, s);
|
auto pjs = peekSpin(p, j, s);
|
||||||
auto fj = peekSpin(f, j);
|
auto fj = peekSpin(f, j);
|
||||||
|
|
||||||
for(int i = 0; i < Nc; ++i)
|
for(int i = 0; i < Fimpl::Dimension; ++i)
|
||||||
{
|
{
|
||||||
pokeColour(pjs, peekColour(fj, i), i, c);
|
pokeColour(pjs, peekColour(fj, i), i, c);
|
||||||
}
|
}
|
||||||
@ -436,15 +438,16 @@ namespace QCD {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Prop, class Ferm>
|
//template <class Prop, class Ferm>
|
||||||
void PropToFerm(Ferm &f, const Prop &p, const int s, const int c)
|
template <class Fimpl>
|
||||||
|
void PropToFerm(typename Fimpl::FermionField &f, const typename Fimpl::PropagatorField &p, const int s, const int c)
|
||||||
{
|
{
|
||||||
for(int j = 0; j < Ns; ++j)
|
for(int j = 0; j < Ns; ++j)
|
||||||
{
|
{
|
||||||
auto pjs = peekSpin(p, j, s);
|
auto pjs = peekSpin(p, j, s);
|
||||||
auto fj = peekSpin(f, j);
|
auto fj = peekSpin(f, j);
|
||||||
|
|
||||||
for(int i = 0; i < Nc; ++i)
|
for(int i = 0; i < Fimpl::Dimension; ++i)
|
||||||
{
|
{
|
||||||
pokeColour(fj, peekColour(pjs, i, c), i);
|
pokeColour(fj, peekColour(pjs, i, c), i);
|
||||||
}
|
}
|
||||||
@ -503,38 +506,6 @@ namespace QCD {
|
|||||||
} //namespace QCD
|
} //namespace QCD
|
||||||
} // Grid
|
} // Grid
|
||||||
|
|
||||||
/*
|
|
||||||
<<<<<<< HEAD
|
|
||||||
#include <Grid/qcd/utils/SpaceTimeGrid.h>
|
|
||||||
#include <Grid/qcd/spin/Dirac.h>
|
|
||||||
#include <Grid/qcd/spin/TwoSpinor.h>
|
|
||||||
#include <Grid/qcd/utils/LinalgUtils.h>
|
|
||||||
#include <Grid/qcd/utils/CovariantCshift.h>
|
|
||||||
|
|
||||||
// Include representations
|
|
||||||
#include <Grid/qcd/utils/SUn.h>
|
|
||||||
#include <Grid/qcd/utils/SUnAdjoint.h>
|
|
||||||
#include <Grid/qcd/utils/SUnTwoIndex.h>
|
|
||||||
#include <Grid/qcd/representations/hmc_types.h>
|
|
||||||
|
|
||||||
// Scalar field
|
|
||||||
#include <Grid/qcd/utils/ScalarObjs.h>
|
|
||||||
|
|
||||||
#include <Grid/qcd/action/Actions.h>
|
|
||||||
|
|
||||||
#include <Grid/qcd/smearing/Smearing.h>
|
|
||||||
|
|
||||||
#include <Grid/qcd/hmc/integrators/Integrator.h>
|
|
||||||
#include <Grid/qcd/hmc/integrators/Integrator_algorithm.h>
|
|
||||||
#include <Grid/qcd/observables/hmc_observable.h>
|
|
||||||
#include <Grid/qcd/hmc/HMC.h>
|
|
||||||
|
|
||||||
|
|
||||||
//#include <Grid/qcd/modules/mods.h>
|
|
||||||
=======
|
|
||||||
|
|
||||||
>>>>>>> develop
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -469,7 +469,7 @@ void CayleyFermion5D<Impl>::MooeeInternalAsm(const FermionField &psi, FermionFie
|
|||||||
}
|
}
|
||||||
a0 = a0+incr;
|
a0 = a0+incr;
|
||||||
a1 = a1+incr;
|
a1 = a1+incr;
|
||||||
a2 = a2+sizeof(Simd::scalar_type);
|
a2 = a2+sizeof(typename Simd::scalar_type);
|
||||||
}}
|
}}
|
||||||
{
|
{
|
||||||
int lexa = s1+LLs*site;
|
int lexa = s1+LLs*site;
|
||||||
@ -701,7 +701,7 @@ void CayleyFermion5D<Impl>::MooeeInternalZAsm(const FermionField &psi, FermionFi
|
|||||||
}
|
}
|
||||||
a0 = a0+incr;
|
a0 = a0+incr;
|
||||||
a1 = a1+incr;
|
a1 = a1+incr;
|
||||||
a2 = a2+sizeof(Simd::scalar_type);
|
a2 = a2+sizeof(typename Simd::scalar_type);
|
||||||
}}
|
}}
|
||||||
{
|
{
|
||||||
int lexa = s1+LLs*site;
|
int lexa = s1+LLs*site;
|
||||||
|
@ -475,7 +475,7 @@ namespace QCD {
|
|||||||
}
|
}
|
||||||
a0 = a0 + incr;
|
a0 = a0 + incr;
|
||||||
a1 = a1 + incr;
|
a1 = a1 + incr;
|
||||||
a2 = a2 + sizeof(Simd::scalar_type);
|
a2 = a2 + sizeof(typename Simd::scalar_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,11 +50,13 @@ Author: Peter Boyle <pabobyle@ph.ed.ac.uk>
|
|||||||
////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
|
|
||||||
#include <Grid/qcd/action/fermion/WilsonFermion.h> // 4d wilson like
|
#include <Grid/qcd/action/fermion/WilsonFermion.h> // 4d wilson like
|
||||||
#include <Grid/qcd/action/fermion/WilsonTMFermion.h> // 4d wilson like
|
#include <Grid/qcd/action/fermion/WilsonTMFermion.h> // 4d wilson like
|
||||||
|
#include <Grid/qcd/action/fermion/WilsonCloverFermion.h> // 4d wilson clover fermions
|
||||||
#include <Grid/qcd/action/fermion/WilsonFermion5D.h> // 5d base used by all 5d overlap types
|
#include <Grid/qcd/action/fermion/WilsonFermion5D.h> // 5d base used by all 5d overlap types
|
||||||
//#include <Grid/qcd/action/fermion/CloverFermion.h>
|
|
||||||
#include <Grid/qcd/action/fermion/ImprovedStaggeredFermion.h>
|
#include <Grid/qcd/action/fermion/ImprovedStaggeredFermion.h>
|
||||||
#include <Grid/qcd/action/fermion/ImprovedStaggeredFermion5D.h>
|
#include <Grid/qcd/action/fermion/ImprovedStaggeredFermion5D.h>
|
||||||
|
|
||||||
#include <Grid/qcd/action/fermion/CayleyFermion5D.h> // Cayley types
|
#include <Grid/qcd/action/fermion/CayleyFermion5D.h> // Cayley types
|
||||||
#include <Grid/qcd/action/fermion/DomainWallFermion.h>
|
#include <Grid/qcd/action/fermion/DomainWallFermion.h>
|
||||||
#include <Grid/qcd/action/fermion/DomainWallEOFAFermion.h>
|
#include <Grid/qcd/action/fermion/DomainWallEOFAFermion.h>
|
||||||
@ -104,10 +106,33 @@ typedef WilsonFermion<WilsonTwoIndexSymmetricImplR> WilsonTwoIndexSymmetricFermi
|
|||||||
typedef WilsonFermion<WilsonTwoIndexSymmetricImplF> WilsonTwoIndexSymmetricFermionF;
|
typedef WilsonFermion<WilsonTwoIndexSymmetricImplF> WilsonTwoIndexSymmetricFermionF;
|
||||||
typedef WilsonFermion<WilsonTwoIndexSymmetricImplD> WilsonTwoIndexSymmetricFermionD;
|
typedef WilsonFermion<WilsonTwoIndexSymmetricImplD> WilsonTwoIndexSymmetricFermionD;
|
||||||
|
|
||||||
|
typedef WilsonFermion<WilsonTwoIndexAntiSymmetricImplR> WilsonTwoIndexAntiSymmetricFermionR;
|
||||||
|
typedef WilsonFermion<WilsonTwoIndexAntiSymmetricImplF> WilsonTwoIndexAntiSymmetricFermionF;
|
||||||
|
typedef WilsonFermion<WilsonTwoIndexAntiSymmetricImplD> WilsonTwoIndexAntiSymmetricFermionD;
|
||||||
|
|
||||||
|
// Twisted mass fermion
|
||||||
typedef WilsonTMFermion<WilsonImplR> WilsonTMFermionR;
|
typedef WilsonTMFermion<WilsonImplR> WilsonTMFermionR;
|
||||||
typedef WilsonTMFermion<WilsonImplF> WilsonTMFermionF;
|
typedef WilsonTMFermion<WilsonImplF> WilsonTMFermionF;
|
||||||
typedef WilsonTMFermion<WilsonImplD> WilsonTMFermionD;
|
typedef WilsonTMFermion<WilsonImplD> WilsonTMFermionD;
|
||||||
|
|
||||||
|
// Clover fermions
|
||||||
|
typedef WilsonCloverFermion<WilsonImplR> WilsonCloverFermionR;
|
||||||
|
typedef WilsonCloverFermion<WilsonImplF> WilsonCloverFermionF;
|
||||||
|
typedef WilsonCloverFermion<WilsonImplD> WilsonCloverFermionD;
|
||||||
|
|
||||||
|
typedef WilsonCloverFermion<WilsonAdjImplR> WilsonCloverAdjFermionR;
|
||||||
|
typedef WilsonCloverFermion<WilsonAdjImplF> WilsonCloverAdjFermionF;
|
||||||
|
typedef WilsonCloverFermion<WilsonAdjImplD> WilsonCloverAdjFermionD;
|
||||||
|
|
||||||
|
typedef WilsonCloverFermion<WilsonTwoIndexSymmetricImplR> WilsonCloverTwoIndexSymmetricFermionR;
|
||||||
|
typedef WilsonCloverFermion<WilsonTwoIndexSymmetricImplF> WilsonCloverTwoIndexSymmetricFermionF;
|
||||||
|
typedef WilsonCloverFermion<WilsonTwoIndexSymmetricImplD> WilsonCloverTwoIndexSymmetricFermionD;
|
||||||
|
|
||||||
|
typedef WilsonCloverFermion<WilsonTwoIndexAntiSymmetricImplR> WilsonCloverTwoIndexAntiSymmetricFermionR;
|
||||||
|
typedef WilsonCloverFermion<WilsonTwoIndexAntiSymmetricImplF> WilsonCloverTwoIndexAntiSymmetricFermionF;
|
||||||
|
typedef WilsonCloverFermion<WilsonTwoIndexAntiSymmetricImplD> WilsonCloverTwoIndexAntiSymmetricFermionD;
|
||||||
|
|
||||||
|
// Domain Wall fermions
|
||||||
typedef DomainWallFermion<WilsonImplR> DomainWallFermionR;
|
typedef DomainWallFermion<WilsonImplR> DomainWallFermionR;
|
||||||
typedef DomainWallFermion<WilsonImplF> DomainWallFermionF;
|
typedef DomainWallFermion<WilsonImplF> DomainWallFermionF;
|
||||||
typedef DomainWallFermion<WilsonImplD> DomainWallFermionD;
|
typedef DomainWallFermion<WilsonImplD> DomainWallFermionD;
|
||||||
|
@ -70,7 +70,9 @@ Author: Peter Boyle <pabobyle@ph.ed.ac.uk>
|
|||||||
|
|
||||||
#define TwoIndexFermOpTemplateInstantiate(A) \
|
#define TwoIndexFermOpTemplateInstantiate(A) \
|
||||||
template class A<WilsonTwoIndexSymmetricImplF>; \
|
template class A<WilsonTwoIndexSymmetricImplF>; \
|
||||||
template class A<WilsonTwoIndexSymmetricImplD>;
|
template class A<WilsonTwoIndexSymmetricImplD>; \
|
||||||
|
template class A<WilsonTwoIndexAntiSymmetricImplF>; \
|
||||||
|
template class A<WilsonTwoIndexAntiSymmetricImplD>;
|
||||||
|
|
||||||
#define FermOp5dVecTemplateInstantiate(A) \
|
#define FermOp5dVecTemplateInstantiate(A) \
|
||||||
template class A<DomainWallVec5dImplF>; \
|
template class A<DomainWallVec5dImplF>; \
|
||||||
|
@ -164,6 +164,7 @@ namespace QCD {
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
static const int Dimension = Representation::Dimension;
|
static const int Dimension = Representation::Dimension;
|
||||||
|
static const bool isFundamental = Representation::isFundamental;
|
||||||
static const bool LsVectorised=false;
|
static const bool LsVectorised=false;
|
||||||
static const int Nhcs = Options::Nhcs;
|
static const int Nhcs = Options::Nhcs;
|
||||||
|
|
||||||
@ -263,6 +264,20 @@ namespace QCD {
|
|||||||
PokeIndex<LorentzIndex>(mat,link,mu);
|
PokeIndex<LorentzIndex>(mat,link,mu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void outerProductImpl(PropagatorField &mat, const FermionField &B, const FermionField &A){
|
||||||
|
mat = outerProduct(B,A);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void TraceSpinImpl(GaugeLinkField &mat, PropagatorField&P) {
|
||||||
|
mat = TraceIndex<SpinIndex>(P);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void extractLinkField(std::vector<GaugeLinkField> &mat, DoubledGaugeField &Uds){
|
||||||
|
for (int mu = 0; mu < Nd; mu++)
|
||||||
|
mat[mu] = PeekIndex<LorentzIndex>(Uds, mu);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField Ã,int mu){
|
inline void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField Ã,int mu){
|
||||||
|
|
||||||
int Ls=Btilde._grid->_fdimensions[0];
|
int Ls=Btilde._grid->_fdimensions[0];
|
||||||
@ -284,27 +299,28 @@ namespace QCD {
|
|||||||
////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Single flavour four spinors with colour index, 5d redblack
|
// Single flavour four spinors with colour index, 5d redblack
|
||||||
////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////
|
||||||
template<class S,int Nrepresentation=Nc, class Options=CoeffReal>
|
template<class S,class Representation = FundamentalRepresentation, class Options=CoeffReal>
|
||||||
class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepresentation> > {
|
class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Representation::Dimension> > {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef PeriodicGaugeImpl<GaugeImplTypes<S, Nrepresentation> > Gimpl;
|
typedef PeriodicGaugeImpl<GaugeImplTypes<S, Representation::Dimension> > Gimpl;
|
||||||
INHERIT_GIMPL_TYPES(Gimpl);
|
INHERIT_GIMPL_TYPES(Gimpl);
|
||||||
|
|
||||||
static const int Dimension = Nrepresentation;
|
static const int Dimension = Representation::Dimension;
|
||||||
|
static const bool isFundamental = Representation::isFundamental;
|
||||||
static const bool LsVectorised=true;
|
static const bool LsVectorised=true;
|
||||||
static const int Nhcs = Options::Nhcs;
|
static const int Nhcs = Options::Nhcs;
|
||||||
|
|
||||||
typedef typename Options::_Coeff_t Coeff_t;
|
typedef typename Options::_Coeff_t Coeff_t;
|
||||||
typedef typename Options::template PrecisionMapper<Simd>::LowerPrecVector SimdL;
|
typedef typename Options::template PrecisionMapper<Simd>::LowerPrecVector SimdL;
|
||||||
|
|
||||||
template <typename vtype> using iImplSpinor = iScalar<iVector<iVector<vtype, Nrepresentation>, Ns> >;
|
template <typename vtype> using iImplSpinor = iScalar<iVector<iVector<vtype, Dimension>, Ns> >;
|
||||||
template <typename vtype> using iImplPropagator = iScalar<iMatrix<iMatrix<vtype, Nrepresentation>, Ns> >;
|
template <typename vtype> using iImplPropagator = iScalar<iMatrix<iMatrix<vtype, Dimension>, Ns> >;
|
||||||
template <typename vtype> using iImplHalfSpinor = iScalar<iVector<iVector<vtype, Nrepresentation>, Nhs> >;
|
template <typename vtype> using iImplHalfSpinor = iScalar<iVector<iVector<vtype, Dimension>, Nhs> >;
|
||||||
template <typename vtype> using iImplHalfCommSpinor = iScalar<iVector<iVector<vtype, Nrepresentation>, Nhcs> >;
|
template <typename vtype> using iImplHalfCommSpinor = iScalar<iVector<iVector<vtype, Dimension>, Nhcs> >;
|
||||||
template <typename vtype> using iImplDoubledGaugeField = iVector<iScalar<iMatrix<vtype, Nrepresentation> >, Nds>;
|
template <typename vtype> using iImplDoubledGaugeField = iVector<iScalar<iMatrix<vtype, Dimension> >, Nds>;
|
||||||
template <typename vtype> using iImplGaugeField = iVector<iScalar<iMatrix<vtype, Nrepresentation> >, Nd>;
|
template <typename vtype> using iImplGaugeField = iVector<iScalar<iMatrix<vtype, Dimension> >, Nd>;
|
||||||
template <typename vtype> using iImplGaugeLink = iScalar<iScalar<iMatrix<vtype, Nrepresentation> > >;
|
template <typename vtype> using iImplGaugeLink = iScalar<iScalar<iMatrix<vtype, Dimension> > >;
|
||||||
|
|
||||||
typedef iImplSpinor<Simd> SiteSpinor;
|
typedef iImplSpinor<Simd> SiteSpinor;
|
||||||
typedef iImplPropagator<Simd> SitePropagator;
|
typedef iImplPropagator<Simd> SitePropagator;
|
||||||
@ -340,8 +356,8 @@ class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepres
|
|||||||
const SiteHalfSpinor &chi, int mu, StencilEntry *SE,
|
const SiteHalfSpinor &chi, int mu, StencilEntry *SE,
|
||||||
StencilImpl &St) {
|
StencilImpl &St) {
|
||||||
SiteGaugeLink UU;
|
SiteGaugeLink UU;
|
||||||
for (int i = 0; i < Nrepresentation; i++) {
|
for (int i = 0; i < Dimension; i++) {
|
||||||
for (int j = 0; j < Nrepresentation; j++) {
|
for (int j = 0; j < Dimension; j++) {
|
||||||
vsplat(UU()()(i, j), U(mu)()(i, j));
|
vsplat(UU()()(i, j), U(mu)()(i, j));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -353,8 +369,8 @@ class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepres
|
|||||||
const SitePropagator &chi,
|
const SitePropagator &chi,
|
||||||
int mu) {
|
int mu) {
|
||||||
SiteGaugeLink UU;
|
SiteGaugeLink UU;
|
||||||
for (int i = 0; i < Nrepresentation; i++) {
|
for (int i = 0; i < Dimension; i++) {
|
||||||
for (int j = 0; j < Nrepresentation; j++) {
|
for (int j = 0; j < Dimension; j++) {
|
||||||
vsplat(UU()()(i, j), U(mu)()(i, j));
|
vsplat(UU()()(i, j), U(mu)()(i, j));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -393,6 +409,19 @@ class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepres
|
|||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void outerProductImpl(PropagatorField &mat, const FermionField &Btilde, const FermionField &A){
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void TraceSpinImpl(GaugeLinkField &mat, PropagatorField&P) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void extractLinkField(std::vector<GaugeLinkField> &mat, DoubledGaugeField &Uds){
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField Ã, int mu) {
|
inline void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField Ã, int mu) {
|
||||||
|
|
||||||
assert(0);
|
assert(0);
|
||||||
@ -445,25 +474,26 @@ class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepres
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Flavour doubled spinors; is Gparity the only? what about C*?
|
// Flavour doubled spinors; is Gparity the only? what about C*?
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
template <class S, int Nrepresentation, class Options=CoeffReal>
|
template <class S, class Representation = FundamentalRepresentation, class Options=CoeffReal>
|
||||||
class GparityWilsonImpl : public ConjugateGaugeImpl<GaugeImplTypes<S, Nrepresentation> > {
|
class GparityWilsonImpl : public ConjugateGaugeImpl<GaugeImplTypes<S, Representation::Dimension> > {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static const int Dimension = Nrepresentation;
|
static const int Dimension = Representation::Dimension;
|
||||||
|
static const bool isFundamental = Representation::isFundamental;
|
||||||
static const int Nhcs = Options::Nhcs;
|
static const int Nhcs = Options::Nhcs;
|
||||||
static const bool LsVectorised=false;
|
static const bool LsVectorised=false;
|
||||||
|
|
||||||
typedef ConjugateGaugeImpl< GaugeImplTypes<S,Nrepresentation> > Gimpl;
|
typedef ConjugateGaugeImpl< GaugeImplTypes<S,Dimension> > Gimpl;
|
||||||
INHERIT_GIMPL_TYPES(Gimpl);
|
INHERIT_GIMPL_TYPES(Gimpl);
|
||||||
|
|
||||||
typedef typename Options::_Coeff_t Coeff_t;
|
typedef typename Options::_Coeff_t Coeff_t;
|
||||||
typedef typename Options::template PrecisionMapper<Simd>::LowerPrecVector SimdL;
|
typedef typename Options::template PrecisionMapper<Simd>::LowerPrecVector SimdL;
|
||||||
|
|
||||||
template <typename vtype> using iImplSpinor = iVector<iVector<iVector<vtype, Nrepresentation>, Ns>, Ngp>;
|
template <typename vtype> using iImplSpinor = iVector<iVector<iVector<vtype, Dimension>, Ns>, Ngp>;
|
||||||
template <typename vtype> using iImplPropagator = iVector<iMatrix<iMatrix<vtype, Nrepresentation>, Ns>, Ngp>;
|
template <typename vtype> using iImplPropagator = iVector<iMatrix<iMatrix<vtype, Dimension>, Ns>, Ngp>;
|
||||||
template <typename vtype> using iImplHalfSpinor = iVector<iVector<iVector<vtype, Nrepresentation>, Nhs>, Ngp>;
|
template <typename vtype> using iImplHalfSpinor = iVector<iVector<iVector<vtype, Dimension>, Nhs>, Ngp>;
|
||||||
template <typename vtype> using iImplHalfCommSpinor = iVector<iVector<iVector<vtype, Nrepresentation>, Nhcs>, Ngp>;
|
template <typename vtype> using iImplHalfCommSpinor = iVector<iVector<iVector<vtype, Dimension>, Nhcs>, Ngp>;
|
||||||
template <typename vtype> using iImplDoubledGaugeField = iVector<iVector<iScalar<iMatrix<vtype, Nrepresentation> >, Nds>, Ngp>;
|
template <typename vtype> using iImplDoubledGaugeField = iVector<iVector<iScalar<iMatrix<vtype, Dimension> >, Nds>, Ngp>;
|
||||||
|
|
||||||
typedef iImplSpinor<Simd> SiteSpinor;
|
typedef iImplSpinor<Simd> SiteSpinor;
|
||||||
typedef iImplPropagator<Simd> SitePropagator;
|
typedef iImplPropagator<Simd> SitePropagator;
|
||||||
@ -636,6 +666,25 @@ class GparityWilsonImpl : public ConjugateGaugeImpl<GaugeImplTypes<S, Nrepresent
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void outerProductImpl(PropagatorField &mat, const FermionField &Btilde, const FermionField &A){
|
||||||
|
//mat = outerProduct(Btilde, A);
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void TraceSpinImpl(GaugeLinkField &mat, PropagatorField&P) {
|
||||||
|
assert(0);
|
||||||
|
/*
|
||||||
|
auto tmp = TraceIndex<SpinIndex>(P);
|
||||||
|
parallel_for(auto ss = tmp.begin(); ss < tmp.end(); ss++) {
|
||||||
|
mat[ss]() = tmp[ss](0, 0) + conjugate(tmp[ss](1, 1));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void extractLinkField(std::vector<GaugeLinkField> &mat, DoubledGaugeField &Uds){
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
inline void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField Ã, int mu) {
|
inline void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField Ã, int mu) {
|
||||||
|
|
||||||
int Ls = Btilde._grid->_fdimensions[0];
|
int Ls = Btilde._grid->_fdimensions[0];
|
||||||
@ -665,6 +714,7 @@ class StaggeredImpl : public PeriodicGaugeImpl<GaugeImplTypes<S, Representation:
|
|||||||
|
|
||||||
typedef RealD _Coeff_t ;
|
typedef RealD _Coeff_t ;
|
||||||
static const int Dimension = Representation::Dimension;
|
static const int Dimension = Representation::Dimension;
|
||||||
|
static const bool isFundamental = Representation::isFundamental;
|
||||||
static const bool LsVectorised=false;
|
static const bool LsVectorised=false;
|
||||||
typedef PeriodicGaugeImpl<GaugeImplTypes<S, Dimension > > Gimpl;
|
typedef PeriodicGaugeImpl<GaugeImplTypes<S, Dimension > > Gimpl;
|
||||||
|
|
||||||
@ -793,6 +843,7 @@ class StaggeredImpl : public PeriodicGaugeImpl<GaugeImplTypes<S, Representation:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
static const int Dimension = Representation::Dimension;
|
static const int Dimension = Representation::Dimension;
|
||||||
|
static const bool isFundamental = Representation::isFundamental;
|
||||||
static const bool LsVectorised=true;
|
static const bool LsVectorised=true;
|
||||||
typedef RealD Coeff_t ;
|
typedef RealD Coeff_t ;
|
||||||
typedef PeriodicGaugeImpl<GaugeImplTypes<S, Dimension > > Gimpl;
|
typedef PeriodicGaugeImpl<GaugeImplTypes<S, Dimension > > Gimpl;
|
||||||
@ -983,29 +1034,33 @@ typedef WilsonImpl<vComplex, TwoIndexSymmetricRepresentation, CoeffReal > Wilso
|
|||||||
typedef WilsonImpl<vComplexF, TwoIndexSymmetricRepresentation, CoeffReal > WilsonTwoIndexSymmetricImplF; // Float
|
typedef WilsonImpl<vComplexF, TwoIndexSymmetricRepresentation, CoeffReal > WilsonTwoIndexSymmetricImplF; // Float
|
||||||
typedef WilsonImpl<vComplexD, TwoIndexSymmetricRepresentation, CoeffReal > WilsonTwoIndexSymmetricImplD; // Double
|
typedef WilsonImpl<vComplexD, TwoIndexSymmetricRepresentation, CoeffReal > WilsonTwoIndexSymmetricImplD; // Double
|
||||||
|
|
||||||
typedef DomainWallVec5dImpl<vComplex ,Nc, CoeffReal> DomainWallVec5dImplR; // Real.. whichever prec
|
typedef WilsonImpl<vComplex, TwoIndexAntiSymmetricRepresentation, CoeffReal > WilsonTwoIndexAntiSymmetricImplR; // Real.. whichever prec
|
||||||
typedef DomainWallVec5dImpl<vComplexF,Nc, CoeffReal> DomainWallVec5dImplF; // Float
|
typedef WilsonImpl<vComplexF, TwoIndexAntiSymmetricRepresentation, CoeffReal > WilsonTwoIndexAntiSymmetricImplF; // Float
|
||||||
typedef DomainWallVec5dImpl<vComplexD,Nc, CoeffReal> DomainWallVec5dImplD; // Double
|
typedef WilsonImpl<vComplexD, TwoIndexAntiSymmetricRepresentation, CoeffReal > WilsonTwoIndexAntiSymmetricImplD; // Double
|
||||||
|
|
||||||
typedef DomainWallVec5dImpl<vComplex ,Nc, CoeffRealHalfComms> DomainWallVec5dImplRL; // Real.. whichever prec
|
typedef DomainWallVec5dImpl<vComplex ,FundamentalRepresentation, CoeffReal> DomainWallVec5dImplR; // Real.. whichever prec
|
||||||
typedef DomainWallVec5dImpl<vComplexF,Nc, CoeffRealHalfComms> DomainWallVec5dImplFH; // Float
|
typedef DomainWallVec5dImpl<vComplexF,FundamentalRepresentation, CoeffReal> DomainWallVec5dImplF; // Float
|
||||||
typedef DomainWallVec5dImpl<vComplexD,Nc, CoeffRealHalfComms> DomainWallVec5dImplDF; // Double
|
typedef DomainWallVec5dImpl<vComplexD,FundamentalRepresentation, CoeffReal> DomainWallVec5dImplD; // Double
|
||||||
|
|
||||||
typedef DomainWallVec5dImpl<vComplex ,Nc,CoeffComplex> ZDomainWallVec5dImplR; // Real.. whichever prec
|
typedef DomainWallVec5dImpl<vComplex ,FundamentalRepresentation, CoeffRealHalfComms> DomainWallVec5dImplRL; // Real.. whichever prec
|
||||||
typedef DomainWallVec5dImpl<vComplexF,Nc,CoeffComplex> ZDomainWallVec5dImplF; // Float
|
typedef DomainWallVec5dImpl<vComplexF,FundamentalRepresentation, CoeffRealHalfComms> DomainWallVec5dImplFH; // Float
|
||||||
typedef DomainWallVec5dImpl<vComplexD,Nc,CoeffComplex> ZDomainWallVec5dImplD; // Double
|
typedef DomainWallVec5dImpl<vComplexD,FundamentalRepresentation, CoeffRealHalfComms> DomainWallVec5dImplDF; // Double
|
||||||
|
|
||||||
typedef DomainWallVec5dImpl<vComplex ,Nc,CoeffComplexHalfComms> ZDomainWallVec5dImplRL; // Real.. whichever prec
|
typedef DomainWallVec5dImpl<vComplex ,FundamentalRepresentation,CoeffComplex> ZDomainWallVec5dImplR; // Real.. whichever prec
|
||||||
typedef DomainWallVec5dImpl<vComplexF,Nc,CoeffComplexHalfComms> ZDomainWallVec5dImplFH; // Float
|
typedef DomainWallVec5dImpl<vComplexF,FundamentalRepresentation,CoeffComplex> ZDomainWallVec5dImplF; // Float
|
||||||
typedef DomainWallVec5dImpl<vComplexD,Nc,CoeffComplexHalfComms> ZDomainWallVec5dImplDF; // Double
|
typedef DomainWallVec5dImpl<vComplexD,FundamentalRepresentation,CoeffComplex> ZDomainWallVec5dImplD; // Double
|
||||||
|
|
||||||
typedef GparityWilsonImpl<vComplex , Nc,CoeffReal> GparityWilsonImplR; // Real.. whichever prec
|
typedef DomainWallVec5dImpl<vComplex ,FundamentalRepresentation,CoeffComplexHalfComms> ZDomainWallVec5dImplRL; // Real.. whichever prec
|
||||||
typedef GparityWilsonImpl<vComplexF, Nc,CoeffReal> GparityWilsonImplF; // Float
|
typedef DomainWallVec5dImpl<vComplexF,FundamentalRepresentation,CoeffComplexHalfComms> ZDomainWallVec5dImplFH; // Float
|
||||||
typedef GparityWilsonImpl<vComplexD, Nc,CoeffReal> GparityWilsonImplD; // Double
|
typedef DomainWallVec5dImpl<vComplexD,FundamentalRepresentation,CoeffComplexHalfComms> ZDomainWallVec5dImplDF; // Double
|
||||||
|
|
||||||
typedef GparityWilsonImpl<vComplex , Nc,CoeffRealHalfComms> GparityWilsonImplRL; // Real.. whichever prec
|
typedef GparityWilsonImpl<vComplex , FundamentalRepresentation,CoeffReal> GparityWilsonImplR; // Real.. whichever prec
|
||||||
typedef GparityWilsonImpl<vComplexF, Nc,CoeffRealHalfComms> GparityWilsonImplFH; // Float
|
typedef GparityWilsonImpl<vComplexF, FundamentalRepresentation,CoeffReal> GparityWilsonImplF; // Float
|
||||||
typedef GparityWilsonImpl<vComplexD, Nc,CoeffRealHalfComms> GparityWilsonImplDF; // Double
|
typedef GparityWilsonImpl<vComplexD, FundamentalRepresentation,CoeffReal> GparityWilsonImplD; // Double
|
||||||
|
|
||||||
|
typedef GparityWilsonImpl<vComplex , FundamentalRepresentation,CoeffRealHalfComms> GparityWilsonImplRL; // Real.. whichever prec
|
||||||
|
typedef GparityWilsonImpl<vComplexF, FundamentalRepresentation,CoeffRealHalfComms> GparityWilsonImplFH; // Float
|
||||||
|
typedef GparityWilsonImpl<vComplexD, FundamentalRepresentation,CoeffRealHalfComms> GparityWilsonImplDF; // Double
|
||||||
|
|
||||||
typedef StaggeredImpl<vComplex, FundamentalRepresentation > StaggeredImplR; // Real.. whichever prec
|
typedef StaggeredImpl<vComplex, FundamentalRepresentation > StaggeredImplR; // Real.. whichever prec
|
||||||
typedef StaggeredImpl<vComplexF, FundamentalRepresentation > StaggeredImplF; // Float
|
typedef StaggeredImpl<vComplexF, FundamentalRepresentation > StaggeredImplF; // Float
|
||||||
|
@ -853,7 +853,7 @@ namespace QCD {
|
|||||||
|
|
||||||
a0 = a0 + incr;
|
a0 = a0 + incr;
|
||||||
a1 = a1 + incr;
|
a1 = a1 + incr;
|
||||||
a2 = a2 + sizeof(Simd::scalar_type);
|
a2 = a2 + sizeof(typename Simd::scalar_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
243
lib/qcd/action/fermion/WilsonCloverFermion.cc
Normal file
243
lib/qcd/action/fermion/WilsonCloverFermion.cc
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: ./lib/qcd/action/fermion/WilsonCloverFermion.cc
|
||||||
|
|
||||||
|
Copyright (C) 2017
|
||||||
|
|
||||||
|
Author: paboyle <paboyle@ph.ed.ac.uk>
|
||||||
|
Author: Guido Cossu <guido.cossu@ed.ac.uk>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
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>
|
||||||
|
#include <Grid/Eigen/Dense>
|
||||||
|
#include <Grid/qcd/spin/Dirac.h>
|
||||||
|
|
||||||
|
namespace Grid
|
||||||
|
{
|
||||||
|
namespace QCD
|
||||||
|
{
|
||||||
|
|
||||||
|
// *NOT* EO
|
||||||
|
template <class Impl>
|
||||||
|
RealD WilsonCloverFermion<Impl>::M(const FermionField &in, FermionField &out)
|
||||||
|
{
|
||||||
|
FermionField temp(out._grid);
|
||||||
|
|
||||||
|
// Wilson term
|
||||||
|
out.checkerboard = in.checkerboard;
|
||||||
|
this->Dhop(in, out, DaggerNo);
|
||||||
|
|
||||||
|
// Clover term
|
||||||
|
Mooee(in, temp);
|
||||||
|
|
||||||
|
out += temp;
|
||||||
|
return norm2(out);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
RealD WilsonCloverFermion<Impl>::Mdag(const FermionField &in, FermionField &out)
|
||||||
|
{
|
||||||
|
FermionField temp(out._grid);
|
||||||
|
|
||||||
|
// Wilson term
|
||||||
|
out.checkerboard = in.checkerboard;
|
||||||
|
this->Dhop(in, out, DaggerYes);
|
||||||
|
|
||||||
|
// Clover term
|
||||||
|
MooeeDag(in, temp);
|
||||||
|
|
||||||
|
out += temp;
|
||||||
|
return norm2(out);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void WilsonCloverFermion<Impl>::ImportGauge(const GaugeField &_Umu)
|
||||||
|
{
|
||||||
|
WilsonFermion<Impl>::ImportGauge(_Umu);
|
||||||
|
GridBase *grid = _Umu._grid;
|
||||||
|
typename Impl::GaugeLinkField Bx(grid), By(grid), Bz(grid), Ex(grid), Ey(grid), Ez(grid);
|
||||||
|
|
||||||
|
// Compute the field strength terms mu>nu
|
||||||
|
WilsonLoops<Impl>::FieldStrength(Bx, _Umu, Zdir, Ydir);
|
||||||
|
WilsonLoops<Impl>::FieldStrength(By, _Umu, Zdir, Xdir);
|
||||||
|
WilsonLoops<Impl>::FieldStrength(Bz, _Umu, Ydir, Xdir);
|
||||||
|
WilsonLoops<Impl>::FieldStrength(Ex, _Umu, Tdir, Xdir);
|
||||||
|
WilsonLoops<Impl>::FieldStrength(Ey, _Umu, Tdir, Ydir);
|
||||||
|
WilsonLoops<Impl>::FieldStrength(Ez, _Umu, Tdir, Zdir);
|
||||||
|
|
||||||
|
// Compute the Clover Operator acting on Colour and Spin
|
||||||
|
// multiply here by the clover coefficients for the anisotropy
|
||||||
|
CloverTerm = fillCloverYZ(Bx) * csw_r;
|
||||||
|
CloverTerm += fillCloverXZ(By) * csw_r;
|
||||||
|
CloverTerm += fillCloverXY(Bz) * csw_r;
|
||||||
|
CloverTerm += fillCloverXT(Ex) * csw_t;
|
||||||
|
CloverTerm += fillCloverYT(Ey) * csw_t;
|
||||||
|
CloverTerm += fillCloverZT(Ez) * csw_t;
|
||||||
|
CloverTerm += diag_mass;
|
||||||
|
|
||||||
|
int lvol = _Umu._grid->lSites();
|
||||||
|
int DimRep = Impl::Dimension;
|
||||||
|
|
||||||
|
Eigen::MatrixXcd EigenCloverOp = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep);
|
||||||
|
Eigen::MatrixXcd EigenInvCloverOp = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep);
|
||||||
|
|
||||||
|
std::vector<int> lcoor;
|
||||||
|
typename SiteCloverType::scalar_object Qx = zero, Qxinv = zero;
|
||||||
|
|
||||||
|
for (int site = 0; site < lvol; site++)
|
||||||
|
{
|
||||||
|
grid->LocalIndexToLocalCoor(site, lcoor);
|
||||||
|
EigenCloverOp = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep);
|
||||||
|
peekLocalSite(Qx, CloverTerm, lcoor);
|
||||||
|
Qxinv = zero;
|
||||||
|
//if (csw!=0){
|
||||||
|
for (int j = 0; j < Ns; j++)
|
||||||
|
for (int k = 0; k < Ns; k++)
|
||||||
|
for (int a = 0; a < DimRep; a++)
|
||||||
|
for (int b = 0; b < DimRep; b++)
|
||||||
|
EigenCloverOp(a + j * DimRep, b + k * DimRep) = Qx()(j, k)(a, b);
|
||||||
|
// if (site==0) std::cout << "site =" << site << "\n" << EigenCloverOp << std::endl;
|
||||||
|
|
||||||
|
EigenInvCloverOp = EigenCloverOp.inverse();
|
||||||
|
//std::cout << EigenInvCloverOp << std::endl;
|
||||||
|
for (int j = 0; j < Ns; j++)
|
||||||
|
for (int k = 0; k < Ns; k++)
|
||||||
|
for (int a = 0; a < DimRep; a++)
|
||||||
|
for (int b = 0; b < DimRep; b++)
|
||||||
|
Qxinv()(j, k)(a, b) = EigenInvCloverOp(a + j * DimRep, b + k * DimRep);
|
||||||
|
// if (site==0) std::cout << "site =" << site << "\n" << EigenInvCloverOp << std::endl;
|
||||||
|
// }
|
||||||
|
pokeLocalSite(Qxinv, CloverTermInv, lcoor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Separate the even and odd parts
|
||||||
|
pickCheckerboard(Even, CloverTermEven, CloverTerm);
|
||||||
|
pickCheckerboard(Odd, CloverTermOdd, CloverTerm);
|
||||||
|
|
||||||
|
pickCheckerboard(Even, CloverTermDagEven, adj(CloverTerm));
|
||||||
|
pickCheckerboard(Odd, CloverTermDagOdd, adj(CloverTerm));
|
||||||
|
|
||||||
|
pickCheckerboard(Even, CloverTermInvEven, CloverTermInv);
|
||||||
|
pickCheckerboard(Odd, CloverTermInvOdd, CloverTermInv);
|
||||||
|
|
||||||
|
pickCheckerboard(Even, CloverTermInvDagEven, adj(CloverTermInv));
|
||||||
|
pickCheckerboard(Odd, CloverTermInvDagOdd, adj(CloverTermInv));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void WilsonCloverFermion<Impl>::Mooee(const FermionField &in, FermionField &out)
|
||||||
|
{
|
||||||
|
this->MooeeInternal(in, out, DaggerNo, InverseNo);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void WilsonCloverFermion<Impl>::MooeeDag(const FermionField &in, FermionField &out)
|
||||||
|
{
|
||||||
|
this->MooeeInternal(in, out, DaggerYes, InverseNo);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void WilsonCloverFermion<Impl>::MooeeInv(const FermionField &in, FermionField &out)
|
||||||
|
{
|
||||||
|
this->MooeeInternal(in, out, DaggerNo, InverseYes);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void WilsonCloverFermion<Impl>::MooeeInvDag(const FermionField &in, FermionField &out)
|
||||||
|
{
|
||||||
|
this->MooeeInternal(in, out, DaggerYes, InverseYes);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void WilsonCloverFermion<Impl>::MooeeInternal(const FermionField &in, FermionField &out, int dag, int inv)
|
||||||
|
{
|
||||||
|
out.checkerboard = in.checkerboard;
|
||||||
|
CloverFieldType *Clover;
|
||||||
|
assert(in.checkerboard == Odd || in.checkerboard == Even);
|
||||||
|
|
||||||
|
if (dag)
|
||||||
|
{
|
||||||
|
if (in._grid->_isCheckerBoarded)
|
||||||
|
{
|
||||||
|
if (in.checkerboard == Odd)
|
||||||
|
{
|
||||||
|
Clover = (inv) ? &CloverTermInvDagOdd : &CloverTermDagOdd;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Clover = (inv) ? &CloverTermInvDagEven : &CloverTermDagEven;
|
||||||
|
}
|
||||||
|
out = *Clover * in;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Clover = (inv) ? &CloverTermInv : &CloverTerm;
|
||||||
|
out = adj(*Clover) * in;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (in._grid->_isCheckerBoarded)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (in.checkerboard == Odd)
|
||||||
|
{
|
||||||
|
// std::cout << "Calling clover term Odd" << std::endl;
|
||||||
|
Clover = (inv) ? &CloverTermInvOdd : &CloverTermOdd;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// std::cout << "Calling clover term Even" << std::endl;
|
||||||
|
Clover = (inv) ? &CloverTermInvEven : &CloverTermEven;
|
||||||
|
}
|
||||||
|
out = *Clover * in;
|
||||||
|
// std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Clover = (inv) ? &CloverTermInv : &CloverTerm;
|
||||||
|
out = *Clover * in;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // MooeeInternal
|
||||||
|
|
||||||
|
|
||||||
|
// Derivative parts
|
||||||
|
template <class Impl>
|
||||||
|
void WilsonCloverFermion<Impl>::MooDeriv(GaugeField &mat, const FermionField &X, const FermionField &Y, int dag)
|
||||||
|
{
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Derivative parts
|
||||||
|
template <class Impl>
|
||||||
|
void WilsonCloverFermion<Impl>::MeeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
|
||||||
|
{
|
||||||
|
assert(0); // not implemented yet
|
||||||
|
}
|
||||||
|
|
||||||
|
FermOpTemplateInstantiate(WilsonCloverFermion);
|
||||||
|
AdjointFermOpTemplateInstantiate(WilsonCloverFermion);
|
||||||
|
TwoIndexFermOpTemplateInstantiate(WilsonCloverFermion);
|
||||||
|
//GparityFermOpTemplateInstantiate(WilsonCloverFermion);
|
||||||
|
}
|
||||||
|
}
|
366
lib/qcd/action/fermion/WilsonCloverFermion.h
Normal file
366
lib/qcd/action/fermion/WilsonCloverFermion.h
Normal file
@ -0,0 +1,366 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: ./lib/qcd/action/fermion/WilsonCloverFermion.h
|
||||||
|
|
||||||
|
Copyright (C) 2017
|
||||||
|
|
||||||
|
Author: Guido Cossu <guido.cossu@ed.ac.uk>
|
||||||
|
Author: David Preti <>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
|
|
||||||
|
#ifndef GRID_QCD_WILSON_CLOVER_FERMION_H
|
||||||
|
#define GRID_QCD_WILSON_CLOVER_FERMION_H
|
||||||
|
|
||||||
|
#include <Grid/Grid.h>
|
||||||
|
|
||||||
|
namespace Grid
|
||||||
|
{
|
||||||
|
namespace QCD
|
||||||
|
{
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Wilson Clover
|
||||||
|
//
|
||||||
|
// Operator ( with anisotropy coefficients):
|
||||||
|
//
|
||||||
|
// Q = 1 + (Nd-1)/xi_0 + m
|
||||||
|
// + W_t + (nu/xi_0) * W_s
|
||||||
|
// - 1/2*[ csw_t * sum_s (sigma_ts F_ts) + (csw_s/xi_0) * sum_ss (sigma_ss F_ss) ]
|
||||||
|
//
|
||||||
|
// s spatial, t temporal directions.
|
||||||
|
// where W_t and W_s are the temporal and spatial components of the
|
||||||
|
// Wilson Dirac operator
|
||||||
|
//
|
||||||
|
// csw_r = csw_t to recover the isotropic version
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
class WilsonCloverFermion : public WilsonFermion<Impl>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// Types definitions
|
||||||
|
INHERIT_IMPL_TYPES(Impl);
|
||||||
|
template <typename vtype>
|
||||||
|
using iImplClover = iScalar<iMatrix<iMatrix<vtype, Impl::Dimension>, Ns>>;
|
||||||
|
typedef iImplClover<Simd> SiteCloverType;
|
||||||
|
typedef Lattice<SiteCloverType> CloverFieldType;
|
||||||
|
|
||||||
|
public:
|
||||||
|
typedef WilsonFermion<Impl> WilsonBase;
|
||||||
|
|
||||||
|
virtual void Instantiatable(void){};
|
||||||
|
// Constructors
|
||||||
|
WilsonCloverFermion(GaugeField &_Umu, GridCartesian &Fgrid,
|
||||||
|
GridRedBlackCartesian &Hgrid,
|
||||||
|
const RealD _mass,
|
||||||
|
const RealD _csw_r = 0.0,
|
||||||
|
const RealD _csw_t = 0.0,
|
||||||
|
const WilsonAnisotropyCoefficients &clover_anisotropy = WilsonAnisotropyCoefficients(),
|
||||||
|
const ImplParams &impl_p = ImplParams()) : WilsonFermion<Impl>(_Umu,
|
||||||
|
Fgrid,
|
||||||
|
Hgrid,
|
||||||
|
_mass, impl_p, clover_anisotropy),
|
||||||
|
CloverTerm(&Fgrid),
|
||||||
|
CloverTermInv(&Fgrid),
|
||||||
|
CloverTermEven(&Hgrid),
|
||||||
|
CloverTermOdd(&Hgrid),
|
||||||
|
CloverTermInvEven(&Hgrid),
|
||||||
|
CloverTermInvOdd(&Hgrid),
|
||||||
|
CloverTermDagEven(&Hgrid),
|
||||||
|
CloverTermDagOdd(&Hgrid),
|
||||||
|
CloverTermInvDagEven(&Hgrid),
|
||||||
|
CloverTermInvDagOdd(&Hgrid)
|
||||||
|
{
|
||||||
|
assert(Nd == 4); // require 4 dimensions
|
||||||
|
|
||||||
|
if (clover_anisotropy.isAnisotropic)
|
||||||
|
{
|
||||||
|
csw_r = _csw_r * 0.5 / clover_anisotropy.xi_0;
|
||||||
|
diag_mass = _mass + 1.0 + (Nd - 1) * (clover_anisotropy.nu / clover_anisotropy.xi_0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
csw_r = _csw_r * 0.5;
|
||||||
|
diag_mass = 4.0 + _mass;
|
||||||
|
}
|
||||||
|
csw_t = _csw_t * 0.5;
|
||||||
|
|
||||||
|
if (csw_r == 0)
|
||||||
|
std::cout << GridLogWarning << "Initializing WilsonCloverFermion with csw_r = 0" << std::endl;
|
||||||
|
if (csw_t == 0)
|
||||||
|
std::cout << GridLogWarning << "Initializing WilsonCloverFermion with csw_t = 0" << std::endl;
|
||||||
|
|
||||||
|
ImportGauge(_Umu);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual RealD M(const FermionField &in, FermionField &out);
|
||||||
|
virtual RealD Mdag(const FermionField &in, FermionField &out);
|
||||||
|
|
||||||
|
virtual void Mooee(const FermionField &in, FermionField &out);
|
||||||
|
virtual void MooeeDag(const FermionField &in, FermionField &out);
|
||||||
|
virtual void MooeeInv(const FermionField &in, FermionField &out);
|
||||||
|
virtual void MooeeInvDag(const FermionField &in, FermionField &out);
|
||||||
|
virtual void MooeeInternal(const FermionField &in, FermionField &out, int dag, int inv);
|
||||||
|
|
||||||
|
//virtual void MDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag);
|
||||||
|
virtual void MooDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag);
|
||||||
|
virtual void MeeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag);
|
||||||
|
|
||||||
|
void ImportGauge(const GaugeField &_Umu);
|
||||||
|
|
||||||
|
// Derivative parts unpreconditioned pseudofermions
|
||||||
|
void MDeriv(GaugeField &force, const FermionField &X, const FermionField &Y, int dag)
|
||||||
|
{
|
||||||
|
conformable(X._grid, Y._grid);
|
||||||
|
conformable(X._grid, force._grid);
|
||||||
|
GaugeLinkField force_mu(force._grid), lambda(force._grid);
|
||||||
|
GaugeField clover_force(force._grid);
|
||||||
|
PropagatorField Lambda(force._grid);
|
||||||
|
|
||||||
|
// Guido: Here we are hitting some performance issues:
|
||||||
|
// need to extract the components of the DoubledGaugeField
|
||||||
|
// for each call
|
||||||
|
// Possible solution
|
||||||
|
// Create a vector object to store them? (cons: wasting space)
|
||||||
|
std::vector<GaugeLinkField> U(Nd, this->Umu._grid);
|
||||||
|
|
||||||
|
Impl::extractLinkField(U, this->Umu);
|
||||||
|
|
||||||
|
force = zero;
|
||||||
|
// Derivative of the Wilson hopping term
|
||||||
|
this->DhopDeriv(force, X, Y, dag);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// Clover term derivative
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
Impl::outerProductImpl(Lambda, X, Y);
|
||||||
|
//std::cout << "Lambda:" << Lambda << std::endl;
|
||||||
|
|
||||||
|
Gamma::Algebra sigma[] = {
|
||||||
|
Gamma::Algebra::SigmaXY,
|
||||||
|
Gamma::Algebra::SigmaXZ,
|
||||||
|
Gamma::Algebra::SigmaXT,
|
||||||
|
Gamma::Algebra::MinusSigmaXY,
|
||||||
|
Gamma::Algebra::SigmaYZ,
|
||||||
|
Gamma::Algebra::SigmaYT,
|
||||||
|
Gamma::Algebra::MinusSigmaXZ,
|
||||||
|
Gamma::Algebra::MinusSigmaYZ,
|
||||||
|
Gamma::Algebra::SigmaZT,
|
||||||
|
Gamma::Algebra::MinusSigmaXT,
|
||||||
|
Gamma::Algebra::MinusSigmaYT,
|
||||||
|
Gamma::Algebra::MinusSigmaZT};
|
||||||
|
|
||||||
|
/*
|
||||||
|
sigma_{\mu \nu}=
|
||||||
|
| 0 sigma[0] sigma[1] sigma[2] |
|
||||||
|
| sigma[3] 0 sigma[4] sigma[5] |
|
||||||
|
| sigma[6] sigma[7] 0 sigma[8] |
|
||||||
|
| sigma[9] sigma[10] sigma[11] 0 |
|
||||||
|
*/
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
clover_force = zero;
|
||||||
|
for (int mu = 0; mu < 4; mu++)
|
||||||
|
{
|
||||||
|
force_mu = zero;
|
||||||
|
for (int nu = 0; nu < 4; nu++)
|
||||||
|
{
|
||||||
|
if (mu == nu)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
RealD factor;
|
||||||
|
if (nu == 4 || mu == 4)
|
||||||
|
{
|
||||||
|
factor = 2.0 * csw_t;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
factor = 2.0 * csw_r;
|
||||||
|
}
|
||||||
|
PropagatorField Slambda = Gamma(sigma[count]) * Lambda; // sigma checked
|
||||||
|
Impl::TraceSpinImpl(lambda, Slambda); // traceSpin ok
|
||||||
|
force_mu -= factor*Cmunu(U, lambda, mu, nu); // checked
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
pokeLorentz(clover_force, U[mu] * force_mu, mu);
|
||||||
|
}
|
||||||
|
//clover_force *= csw;
|
||||||
|
force += clover_force;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Computing C_{\mu \nu}(x) as in Eq.(B.39) in Zbigniew Sroczynski's PhD thesis
|
||||||
|
GaugeLinkField Cmunu(std::vector<GaugeLinkField> &U, GaugeLinkField &lambda, int mu, int nu)
|
||||||
|
{
|
||||||
|
conformable(lambda._grid, U[0]._grid);
|
||||||
|
GaugeLinkField out(lambda._grid), tmp(lambda._grid);
|
||||||
|
// insertion in upper staple
|
||||||
|
// please check redundancy of shift operations
|
||||||
|
|
||||||
|
// C1+
|
||||||
|
tmp = lambda * U[nu];
|
||||||
|
out = Impl::ShiftStaple(Impl::CovShiftForward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu);
|
||||||
|
|
||||||
|
// C2+
|
||||||
|
tmp = U[mu] * Impl::ShiftStaple(adj(lambda), mu);
|
||||||
|
out += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu);
|
||||||
|
|
||||||
|
// C3+
|
||||||
|
tmp = U[nu] * Impl::ShiftStaple(adj(lambda), nu);
|
||||||
|
out += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(tmp, nu))), mu);
|
||||||
|
|
||||||
|
// C4+
|
||||||
|
out += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu) * lambda;
|
||||||
|
|
||||||
|
// insertion in lower staple
|
||||||
|
// C1-
|
||||||
|
out -= Impl::ShiftStaple(lambda, mu) * Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu);
|
||||||
|
|
||||||
|
// C2-
|
||||||
|
tmp = adj(lambda) * U[nu];
|
||||||
|
out -= Impl::ShiftStaple(Impl::CovShiftBackward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu);
|
||||||
|
|
||||||
|
// C3-
|
||||||
|
tmp = lambda * U[nu];
|
||||||
|
out -= Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, tmp)), mu);
|
||||||
|
|
||||||
|
// C4-
|
||||||
|
out -= Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu) * lambda;
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// here fixing the 4 dimensions, make it more general?
|
||||||
|
|
||||||
|
RealD csw_r; // Clover coefficient - spatial
|
||||||
|
RealD csw_t; // Clover coefficient - temporal
|
||||||
|
RealD diag_mass; // Mass term
|
||||||
|
CloverFieldType CloverTerm, CloverTermInv; // Clover term
|
||||||
|
CloverFieldType CloverTermEven, CloverTermOdd; // Clover term EO
|
||||||
|
CloverFieldType CloverTermInvEven, CloverTermInvOdd; // Clover term Inv EO
|
||||||
|
CloverFieldType CloverTermDagEven, CloverTermDagOdd; // Clover term Dag EO
|
||||||
|
CloverFieldType CloverTermInvDagEven, CloverTermInvDagOdd; // Clover term Inv Dag EO
|
||||||
|
|
||||||
|
// eventually these can be compressed into 6x6 blocks instead of the 12x12
|
||||||
|
// using the DeGrand-Rossi basis for the gamma matrices
|
||||||
|
CloverFieldType fillCloverYZ(const GaugeLinkField &F)
|
||||||
|
{
|
||||||
|
CloverFieldType T(F._grid);
|
||||||
|
T = zero;
|
||||||
|
PARALLEL_FOR_LOOP
|
||||||
|
for (int i = 0; i < CloverTerm._grid->oSites(); i++)
|
||||||
|
{
|
||||||
|
T._odata[i]()(0, 1) = timesMinusI(F._odata[i]()());
|
||||||
|
T._odata[i]()(1, 0) = timesMinusI(F._odata[i]()());
|
||||||
|
T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()());
|
||||||
|
T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()());
|
||||||
|
}
|
||||||
|
|
||||||
|
return T;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloverFieldType fillCloverXZ(const GaugeLinkField &F)
|
||||||
|
{
|
||||||
|
CloverFieldType T(F._grid);
|
||||||
|
T = zero;
|
||||||
|
PARALLEL_FOR_LOOP
|
||||||
|
for (int i = 0; i < CloverTerm._grid->oSites(); i++)
|
||||||
|
{
|
||||||
|
T._odata[i]()(0, 1) = -F._odata[i]()();
|
||||||
|
T._odata[i]()(1, 0) = F._odata[i]()();
|
||||||
|
T._odata[i]()(2, 3) = -F._odata[i]()();
|
||||||
|
T._odata[i]()(3, 2) = F._odata[i]()();
|
||||||
|
}
|
||||||
|
|
||||||
|
return T;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloverFieldType fillCloverXY(const GaugeLinkField &F)
|
||||||
|
{
|
||||||
|
CloverFieldType T(F._grid);
|
||||||
|
T = zero;
|
||||||
|
PARALLEL_FOR_LOOP
|
||||||
|
for (int i = 0; i < CloverTerm._grid->oSites(); i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
T._odata[i]()(0, 0) = timesMinusI(F._odata[i]()());
|
||||||
|
T._odata[i]()(1, 1) = timesI(F._odata[i]()());
|
||||||
|
T._odata[i]()(2, 2) = timesMinusI(F._odata[i]()());
|
||||||
|
T._odata[i]()(3, 3) = timesI(F._odata[i]()());
|
||||||
|
}
|
||||||
|
|
||||||
|
return T;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloverFieldType fillCloverXT(const GaugeLinkField &F)
|
||||||
|
{
|
||||||
|
CloverFieldType T(F._grid);
|
||||||
|
T = zero;
|
||||||
|
PARALLEL_FOR_LOOP
|
||||||
|
for (int i = 0; i < CloverTerm._grid->oSites(); i++)
|
||||||
|
{
|
||||||
|
T._odata[i]()(0, 1) = timesI(F._odata[i]()());
|
||||||
|
T._odata[i]()(1, 0) = timesI(F._odata[i]()());
|
||||||
|
T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()());
|
||||||
|
T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()());
|
||||||
|
}
|
||||||
|
|
||||||
|
return T;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloverFieldType fillCloverYT(const GaugeLinkField &F)
|
||||||
|
{
|
||||||
|
CloverFieldType T(F._grid);
|
||||||
|
T = zero;
|
||||||
|
PARALLEL_FOR_LOOP
|
||||||
|
for (int i = 0; i < CloverTerm._grid->oSites(); i++)
|
||||||
|
{
|
||||||
|
T._odata[i]()(0, 1) = -(F._odata[i]()());
|
||||||
|
T._odata[i]()(1, 0) = (F._odata[i]()());
|
||||||
|
T._odata[i]()(2, 3) = (F._odata[i]()());
|
||||||
|
T._odata[i]()(3, 2) = -(F._odata[i]()());
|
||||||
|
}
|
||||||
|
|
||||||
|
return T;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloverFieldType fillCloverZT(const GaugeLinkField &F)
|
||||||
|
{
|
||||||
|
CloverFieldType T(F._grid);
|
||||||
|
T = zero;
|
||||||
|
PARALLEL_FOR_LOOP
|
||||||
|
for (int i = 0; i < CloverTerm._grid->oSites(); i++)
|
||||||
|
{
|
||||||
|
T._odata[i]()(0, 0) = timesI(F._odata[i]()());
|
||||||
|
T._odata[i]()(1, 1) = timesMinusI(F._odata[i]()());
|
||||||
|
T._odata[i]()(2, 2) = timesMinusI(F._odata[i]()());
|
||||||
|
T._odata[i]()(3, 3) = timesI(F._odata[i]()());
|
||||||
|
}
|
||||||
|
|
||||||
|
return T;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // GRID_QCD_WILSON_CLOVER_FERMION_H
|
@ -47,7 +47,8 @@ int WilsonFermionStatic::HandOptDslash;
|
|||||||
template <class Impl>
|
template <class Impl>
|
||||||
WilsonFermion<Impl>::WilsonFermion(GaugeField &_Umu, GridCartesian &Fgrid,
|
WilsonFermion<Impl>::WilsonFermion(GaugeField &_Umu, GridCartesian &Fgrid,
|
||||||
GridRedBlackCartesian &Hgrid, RealD _mass,
|
GridRedBlackCartesian &Hgrid, RealD _mass,
|
||||||
const ImplParams &p)
|
const ImplParams &p,
|
||||||
|
const WilsonAnisotropyCoefficients &anis)
|
||||||
: Kernels(p),
|
: Kernels(p),
|
||||||
_grid(&Fgrid),
|
_grid(&Fgrid),
|
||||||
_cbgrid(&Hgrid),
|
_cbgrid(&Hgrid),
|
||||||
@ -60,16 +61,41 @@ WilsonFermion<Impl>::WilsonFermion(GaugeField &_Umu, GridCartesian &Fgrid,
|
|||||||
Umu(&Fgrid),
|
Umu(&Fgrid),
|
||||||
UmuEven(&Hgrid),
|
UmuEven(&Hgrid),
|
||||||
UmuOdd(&Hgrid),
|
UmuOdd(&Hgrid),
|
||||||
_tmp(&Hgrid)
|
_tmp(&Hgrid),
|
||||||
|
anisotropyCoeff(anis)
|
||||||
{
|
{
|
||||||
// Allocate the required comms buffer
|
// Allocate the required comms buffer
|
||||||
ImportGauge(_Umu);
|
ImportGauge(_Umu);
|
||||||
|
if (anisotropyCoeff.isAnisotropic){
|
||||||
|
diag_mass = mass + 1.0 + (Nd-1)*(anisotropyCoeff.nu / anisotropyCoeff.xi_0);
|
||||||
|
} else {
|
||||||
|
diag_mass = 4.0 + mass;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Impl>
|
template <class Impl>
|
||||||
void WilsonFermion<Impl>::ImportGauge(const GaugeField &_Umu) {
|
void WilsonFermion<Impl>::ImportGauge(const GaugeField &_Umu) {
|
||||||
GaugeField HUmu(_Umu._grid);
|
GaugeField HUmu(_Umu._grid);
|
||||||
HUmu = _Umu * (-0.5);
|
|
||||||
|
//Here multiply the anisotropy coefficients
|
||||||
|
if (anisotropyCoeff.isAnisotropic)
|
||||||
|
{
|
||||||
|
|
||||||
|
for (int mu = 0; mu < Nd; mu++)
|
||||||
|
{
|
||||||
|
GaugeLinkField U_dir = (-0.5)*PeekIndex<LorentzIndex>(_Umu, mu);
|
||||||
|
if (mu != anisotropyCoeff.t_direction)
|
||||||
|
U_dir *= (anisotropyCoeff.nu / anisotropyCoeff.xi_0);
|
||||||
|
|
||||||
|
PokeIndex<LorentzIndex>(HUmu, U_dir, mu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HUmu = _Umu * (-0.5);
|
||||||
|
}
|
||||||
Impl::DoubleStore(GaugeGrid(), Umu, HUmu);
|
Impl::DoubleStore(GaugeGrid(), Umu, HUmu);
|
||||||
pickCheckerboard(Even, UmuEven, Umu);
|
pickCheckerboard(Even, UmuEven, Umu);
|
||||||
pickCheckerboard(Odd, UmuOdd, Umu);
|
pickCheckerboard(Odd, UmuOdd, Umu);
|
||||||
@ -83,14 +109,14 @@ template <class Impl>
|
|||||||
RealD WilsonFermion<Impl>::M(const FermionField &in, FermionField &out) {
|
RealD WilsonFermion<Impl>::M(const FermionField &in, FermionField &out) {
|
||||||
out.checkerboard = in.checkerboard;
|
out.checkerboard = in.checkerboard;
|
||||||
Dhop(in, out, DaggerNo);
|
Dhop(in, out, DaggerNo);
|
||||||
return axpy_norm(out, 4 + mass, in, out);
|
return axpy_norm(out, diag_mass, in, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Impl>
|
template <class Impl>
|
||||||
RealD WilsonFermion<Impl>::Mdag(const FermionField &in, FermionField &out) {
|
RealD WilsonFermion<Impl>::Mdag(const FermionField &in, FermionField &out) {
|
||||||
out.checkerboard = in.checkerboard;
|
out.checkerboard = in.checkerboard;
|
||||||
Dhop(in, out, DaggerYes);
|
Dhop(in, out, DaggerYes);
|
||||||
return axpy_norm(out, 4 + mass, in, out);
|
return axpy_norm(out, diag_mass, in, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Impl>
|
template <class Impl>
|
||||||
@ -114,7 +140,7 @@ void WilsonFermion<Impl>::MeooeDag(const FermionField &in, FermionField &out) {
|
|||||||
template <class Impl>
|
template <class Impl>
|
||||||
void WilsonFermion<Impl>::Mooee(const FermionField &in, FermionField &out) {
|
void WilsonFermion<Impl>::Mooee(const FermionField &in, FermionField &out) {
|
||||||
out.checkerboard = in.checkerboard;
|
out.checkerboard = in.checkerboard;
|
||||||
typename FermionField::scalar_type scal(4.0 + mass);
|
typename FermionField::scalar_type scal(diag_mass);
|
||||||
out = scal * in;
|
out = scal * in;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,7 +153,7 @@ void WilsonFermion<Impl>::MooeeDag(const FermionField &in, FermionField &out) {
|
|||||||
template<class Impl>
|
template<class Impl>
|
||||||
void WilsonFermion<Impl>::MooeeInv(const FermionField &in, FermionField &out) {
|
void WilsonFermion<Impl>::MooeeInv(const FermionField &in, FermionField &out) {
|
||||||
out.checkerboard = in.checkerboard;
|
out.checkerboard = in.checkerboard;
|
||||||
out = (1.0/(4.0+mass))*in;
|
out = (1.0/(diag_mass))*in;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Impl>
|
template<class Impl>
|
||||||
@ -204,7 +230,7 @@ void WilsonFermion<Impl>::DerivInternal(StencilImpl &st, DoubledGaugeField &U,
|
|||||||
|
|
||||||
FermionField Btilde(B._grid);
|
FermionField Btilde(B._grid);
|
||||||
FermionField Atilde(B._grid);
|
FermionField Atilde(B._grid);
|
||||||
Atilde = A;
|
Atilde = A;//redundant
|
||||||
|
|
||||||
st.HaloExchange(B, compressor);
|
st.HaloExchange(B, compressor);
|
||||||
|
|
||||||
@ -393,7 +419,7 @@ void WilsonFermion<Impl>::SeqConservedCurrent(PropagatorField &q_in,
|
|||||||
conformable(_grid, q_in._grid);
|
conformable(_grid, q_in._grid);
|
||||||
conformable(_grid, q_out._grid);
|
conformable(_grid, q_out._grid);
|
||||||
Lattice<iSinglet<Simd>> ph(_grid), coor(_grid);
|
Lattice<iSinglet<Simd>> ph(_grid), coor(_grid);
|
||||||
Complex i(0.0,1.0);
|
ComplexD i(0.0,1.0);
|
||||||
PropagatorField tmpFwd(_grid), tmpBwd(_grid), tmp(_grid);
|
PropagatorField tmpFwd(_grid), tmpBwd(_grid), tmp(_grid);
|
||||||
unsigned int tshift = (mu == Tp) ? 1 : 0;
|
unsigned int tshift = (mu == Tp) ? 1 : 0;
|
||||||
unsigned int LLt = GridDefaultLatt()[Tp];
|
unsigned int LLt = GridDefaultLatt()[Tp];
|
||||||
@ -405,7 +431,7 @@ void WilsonFermion<Impl>::SeqConservedCurrent(PropagatorField &q_in,
|
|||||||
LatticeCoordinate(coor, mu);
|
LatticeCoordinate(coor, mu);
|
||||||
ph = ph + mom[mu]*coor*((1./(_grid->_fdimensions[mu])));
|
ph = ph + mom[mu]*coor*((1./(_grid->_fdimensions[mu])));
|
||||||
}
|
}
|
||||||
ph = exp((Real)(2*M_PI)*i*ph);
|
ph = exp((RealD)(2*M_PI)*i*ph);
|
||||||
|
|
||||||
q_out = zero;
|
q_out = zero;
|
||||||
LatticeInteger coords(_grid);
|
LatticeInteger coords(_grid);
|
||||||
|
@ -44,6 +44,21 @@ class WilsonFermionStatic {
|
|||||||
static const int npoint = 8;
|
static const int npoint = 8;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct WilsonAnisotropyCoefficients: Serializable
|
||||||
|
{
|
||||||
|
GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonAnisotropyCoefficients,
|
||||||
|
bool, isAnisotropic,
|
||||||
|
int, t_direction,
|
||||||
|
double, xi_0,
|
||||||
|
double, nu);
|
||||||
|
|
||||||
|
WilsonAnisotropyCoefficients():
|
||||||
|
isAnisotropic(false),
|
||||||
|
t_direction(Nd-1),
|
||||||
|
xi_0(1.0),
|
||||||
|
nu(1.0){}
|
||||||
|
};
|
||||||
|
|
||||||
template <class Impl>
|
template <class Impl>
|
||||||
class WilsonFermion : public WilsonKernels<Impl>, public WilsonFermionStatic {
|
class WilsonFermion : public WilsonKernels<Impl>, public WilsonFermionStatic {
|
||||||
public:
|
public:
|
||||||
@ -65,8 +80,8 @@ class WilsonFermion : public WilsonKernels<Impl>, public WilsonFermionStatic {
|
|||||||
// override multiply; cut number routines if pass dagger argument
|
// override multiply; cut number routines if pass dagger argument
|
||||||
// and also make interface more uniformly consistent
|
// and also make interface more uniformly consistent
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
RealD M(const FermionField &in, FermionField &out);
|
virtual RealD M(const FermionField &in, FermionField &out);
|
||||||
RealD Mdag(const FermionField &in, FermionField &out);
|
virtual RealD Mdag(const FermionField &in, FermionField &out);
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////
|
||||||
// half checkerboard operations
|
// half checkerboard operations
|
||||||
@ -118,7 +133,8 @@ class WilsonFermion : public WilsonKernels<Impl>, public WilsonFermionStatic {
|
|||||||
// Constructor
|
// Constructor
|
||||||
WilsonFermion(GaugeField &_Umu, GridCartesian &Fgrid,
|
WilsonFermion(GaugeField &_Umu, GridCartesian &Fgrid,
|
||||||
GridRedBlackCartesian &Hgrid, RealD _mass,
|
GridRedBlackCartesian &Hgrid, RealD _mass,
|
||||||
const ImplParams &p = ImplParams());
|
const ImplParams &p = ImplParams(),
|
||||||
|
const WilsonAnisotropyCoefficients &anis = WilsonAnisotropyCoefficients() );
|
||||||
|
|
||||||
// DoubleStore impl dependent
|
// DoubleStore impl dependent
|
||||||
void ImportGauge(const GaugeField &_Umu);
|
void ImportGauge(const GaugeField &_Umu);
|
||||||
@ -130,6 +146,7 @@ class WilsonFermion : public WilsonKernels<Impl>, public WilsonFermionStatic {
|
|||||||
// protected:
|
// protected:
|
||||||
public:
|
public:
|
||||||
RealD mass;
|
RealD mass;
|
||||||
|
RealD diag_mass;
|
||||||
|
|
||||||
GridBase *_grid;
|
GridBase *_grid;
|
||||||
GridBase *_cbgrid;
|
GridBase *_cbgrid;
|
||||||
@ -147,6 +164,8 @@ class WilsonFermion : public WilsonKernels<Impl>, public WilsonFermionStatic {
|
|||||||
LebesgueOrder Lebesgue;
|
LebesgueOrder Lebesgue;
|
||||||
LebesgueOrder LebesgueEvenOdd;
|
LebesgueOrder LebesgueEvenOdd;
|
||||||
|
|
||||||
|
WilsonAnisotropyCoefficients anisotropyCoeff;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
// Conserved current utilities
|
// Conserved current utilities
|
||||||
///////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
|
@ -793,7 +793,7 @@ void WilsonFermion5D<Impl>::SeqConservedCurrent(PropagatorField &q_in,
|
|||||||
Lattice<iSinglet<Simd>> ph(FermionGrid()), coor(FermionGrid());
|
Lattice<iSinglet<Simd>> ph(FermionGrid()), coor(FermionGrid());
|
||||||
PropagatorField tmpFwd(FermionGrid()), tmpBwd(FermionGrid()),
|
PropagatorField tmpFwd(FermionGrid()), tmpBwd(FermionGrid()),
|
||||||
tmp(FermionGrid());
|
tmp(FermionGrid());
|
||||||
Complex i(0.0, 1.0);
|
ComplexD i(0.0, 1.0);
|
||||||
unsigned int tshift = (mu == Tp) ? 1 : 0;
|
unsigned int tshift = (mu == Tp) ? 1 : 0;
|
||||||
unsigned int LLs = q_in._grid->_rdimensions[0];
|
unsigned int LLs = q_in._grid->_rdimensions[0];
|
||||||
unsigned int LLt = GridDefaultLatt()[Tp];
|
unsigned int LLt = GridDefaultLatt()[Tp];
|
||||||
@ -806,7 +806,7 @@ void WilsonFermion5D<Impl>::SeqConservedCurrent(PropagatorField &q_in,
|
|||||||
LatticeCoordinate(coor, nu + 1);
|
LatticeCoordinate(coor, nu + 1);
|
||||||
ph = ph + mom[nu]*coor*((1./(_FourDimGrid->_fdimensions[nu])));
|
ph = ph + mom[nu]*coor*((1./(_FourDimGrid->_fdimensions[nu])));
|
||||||
}
|
}
|
||||||
ph = exp((Real)(2*M_PI)*i*ph);
|
ph = exp((RealD)(2*M_PI)*i*ph);
|
||||||
|
|
||||||
q_out = zero;
|
q_out = zero;
|
||||||
LatticeInteger coords(_FourDimGrid);
|
LatticeInteger coords(_FourDimGrid);
|
||||||
|
@ -55,7 +55,7 @@ template<class Impl> class WilsonKernels : public FermionOperator<Impl> , public
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
template <bool EnableBool = true>
|
template <bool EnableBool = true>
|
||||||
typename std::enable_if<Impl::Dimension == 3 && Nc == 3 &&EnableBool, void>::type
|
typename std::enable_if<Impl::isFundamental==true && Nc == 3 &&EnableBool, void>::type
|
||||||
DhopSite(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf,
|
DhopSite(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf,
|
||||||
int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1)
|
int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1)
|
||||||
{
|
{
|
||||||
@ -99,7 +99,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool EnableBool = true>
|
template <bool EnableBool = true>
|
||||||
typename std::enable_if<(Impl::Dimension != 3 || (Impl::Dimension == 3 && Nc != 3)) && EnableBool, void>::type
|
typename std::enable_if<(Impl::isFundamental==false || (Impl::isFundamental==true && Nc != 3)) && EnableBool, void>::type
|
||||||
DhopSite(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf,
|
DhopSite(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf,
|
||||||
int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1 ) {
|
int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1 ) {
|
||||||
// no kernel choice
|
// no kernel choice
|
||||||
@ -116,7 +116,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool EnableBool = true>
|
template <bool EnableBool = true>
|
||||||
typename std::enable_if<Impl::Dimension == 3 && Nc == 3 && EnableBool,void>::type
|
typename std::enable_if<Impl::isFundamental==true && Nc == 3 && EnableBool,void>::type
|
||||||
DhopSiteDag(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf,
|
DhopSiteDag(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf,
|
||||||
int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1)
|
int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1)
|
||||||
{
|
{
|
||||||
@ -161,7 +161,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool EnableBool = true>
|
template <bool EnableBool = true>
|
||||||
typename std::enable_if<(Impl::Dimension != 3 || (Impl::Dimension == 3 && Nc != 3)) && EnableBool,void>::type
|
typename std::enable_if<(Impl::isFundamental==false || (Impl::isFundamental==true && Nc != 3)) && EnableBool,void>::type
|
||||||
DhopSiteDag(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U,SiteHalfSpinor * buf,
|
DhopSiteDag(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U,SiteHalfSpinor * buf,
|
||||||
int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1) {
|
int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1) {
|
||||||
|
|
||||||
|
@ -946,5 +946,6 @@ INSTANTIATE_THEM(DomainWallVec5dImplFH);
|
|||||||
INSTANTIATE_THEM(DomainWallVec5dImplDF);
|
INSTANTIATE_THEM(DomainWallVec5dImplDF);
|
||||||
INSTANTIATE_THEM(ZDomainWallVec5dImplFH);
|
INSTANTIATE_THEM(ZDomainWallVec5dImplFH);
|
||||||
INSTANTIATE_THEM(ZDomainWallVec5dImplDF);
|
INSTANTIATE_THEM(ZDomainWallVec5dImplDF);
|
||||||
|
INSTANTIATE_THEM(WilsonTwoIndexAntiSymmetricImplF);
|
||||||
|
INSTANTIATE_THEM(WilsonTwoIndexAntiSymmetricImplD);
|
||||||
}}
|
}}
|
||||||
|
@ -89,6 +89,12 @@ class ScalarImplTypes {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef USE_FFT_ACCELERATION
|
||||||
|
#ifndef FFT_MASS
|
||||||
|
#error "USE_FFT_ACCELERATION is defined but not FFT_MASS"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
template <class S, unsigned int N>
|
template <class S, unsigned int N>
|
||||||
class ScalarAdjMatrixImplTypes {
|
class ScalarAdjMatrixImplTypes {
|
||||||
public:
|
public:
|
||||||
@ -109,18 +115,113 @@ class ScalarImplTypes {
|
|||||||
typedef Field FermionField;
|
typedef Field FermionField;
|
||||||
typedef Field PropagatorField;
|
typedef Field PropagatorField;
|
||||||
|
|
||||||
static inline void generate_momenta(Field& P, GridParallelRNG& pRNG) {
|
static void MomentaSquare(ComplexField &out)
|
||||||
|
{
|
||||||
|
GridBase *grid = out._grid;
|
||||||
|
const std::vector<int> &l = grid->FullDimensions();
|
||||||
|
ComplexField kmu(grid);
|
||||||
|
|
||||||
|
for (int mu = 0; mu < grid->Nd(); mu++)
|
||||||
|
{
|
||||||
|
Real twoPiL = M_PI * 2.0 / l[mu];
|
||||||
|
LatticeCoordinate(kmu, mu);
|
||||||
|
kmu = 2.0 * sin(0.5 * twoPiL * kmu);
|
||||||
|
out += kmu * kmu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void MomentumSpacePropagator(ComplexField &out, RealD m)
|
||||||
|
{
|
||||||
|
GridBase *grid = out._grid;
|
||||||
|
ComplexField one(grid);
|
||||||
|
one = Complex(1.0, 0.0);
|
||||||
|
out = m * m;
|
||||||
|
MomentaSquare(out);
|
||||||
|
out = one / out;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void generate_momenta(Field &P, GridParallelRNG &pRNG)
|
||||||
|
{
|
||||||
|
#ifndef USE_FFT_ACCELERATION
|
||||||
Group::GaussianFundamentalLieAlgebraMatrix(pRNG, P);
|
Group::GaussianFundamentalLieAlgebraMatrix(pRNG, P);
|
||||||
|
#else
|
||||||
|
|
||||||
|
Field Pgaussian(P._grid), Pp(P._grid);
|
||||||
|
ComplexField p2(P._grid); p2 = zero;
|
||||||
|
RealD M = FFT_MASS;
|
||||||
|
|
||||||
|
Group::GaussianFundamentalLieAlgebraMatrix(pRNG, Pgaussian);
|
||||||
|
|
||||||
|
FFT theFFT((GridCartesian*)P._grid);
|
||||||
|
theFFT.FFT_all_dim(Pp, Pgaussian, FFT::forward);
|
||||||
|
MomentaSquare(p2);
|
||||||
|
p2 += M * M;
|
||||||
|
p2 = sqrt(p2);
|
||||||
|
Pp *= p2;
|
||||||
|
theFFT.FFT_all_dim(P, Pp, FFT::backward);
|
||||||
|
|
||||||
|
#endif //USE_FFT_ACCELERATION
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Field projectForce(Field& P) {return P;}
|
static inline Field projectForce(Field& P) {return P;}
|
||||||
|
|
||||||
static inline void update_field(Field& P, Field& U, double ep) {
|
static inline void update_field(Field &P, Field &U, double ep)
|
||||||
U += P*ep;
|
{
|
||||||
|
#ifndef USE_FFT_ACCELERATION
|
||||||
|
double t0=usecond();
|
||||||
|
U += P * ep;
|
||||||
|
double t1=usecond();
|
||||||
|
double total_time = (t1-t0)/1e6;
|
||||||
|
std::cout << GridLogIntegrator << "Total time for updating field (s) : " << total_time << std::endl;
|
||||||
|
#else
|
||||||
|
// FFT transform P(x) -> P(p)
|
||||||
|
// divide by (M^2+p^2) M external parameter (how to pass?)
|
||||||
|
// P'(p) = P(p)/(M^2+p^2)
|
||||||
|
// Transform back -> P'(x)
|
||||||
|
// U += P'(x)*ep
|
||||||
|
|
||||||
|
Field Pp(U._grid), P_FFT(U._grid);
|
||||||
|
static ComplexField p2(U._grid);
|
||||||
|
RealD M = FFT_MASS;
|
||||||
|
|
||||||
|
FFT theFFT((GridCartesian*)U._grid);
|
||||||
|
theFFT.FFT_all_dim(Pp, P, FFT::forward);
|
||||||
|
|
||||||
|
static bool first_call = true;
|
||||||
|
if (first_call)
|
||||||
|
{
|
||||||
|
// avoid recomputing
|
||||||
|
MomentumSpacePropagator(p2, M);
|
||||||
|
first_call = false;
|
||||||
|
}
|
||||||
|
Pp *= p2;
|
||||||
|
theFFT.FFT_all_dim(P_FFT, Pp, FFT::backward);
|
||||||
|
U += P_FFT * ep;
|
||||||
|
|
||||||
|
#endif //USE_FFT_ACCELERATION
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline RealD FieldSquareNorm(Field& U) {
|
static inline RealD FieldSquareNorm(Field &U)
|
||||||
return (TensorRemove(sum(trace(U*U))).real());
|
{
|
||||||
|
#ifndef USE_FFT_ACCELERATION
|
||||||
|
return (TensorRemove(sum(trace(U * U))).real());
|
||||||
|
#else
|
||||||
|
// In case of Fourier acceleration we have to:
|
||||||
|
// compute U(p)*U(p)/(M^2+p^2)) Parseval theorem
|
||||||
|
// 1 FFT needed U(x) -> U(p)
|
||||||
|
// M to be passed
|
||||||
|
|
||||||
|
FFT theFFT((GridCartesian*)U._grid);
|
||||||
|
Field Up(U._grid);
|
||||||
|
|
||||||
|
theFFT.FFT_all_dim(Up, U, FFT::forward);
|
||||||
|
RealD M = FFT_MASS;
|
||||||
|
ComplexField p2(U._grid);
|
||||||
|
MomentumSpacePropagator(p2, M);
|
||||||
|
Field Up2 = Up * p2;
|
||||||
|
// from the definition of the DFT we need to divide by the volume
|
||||||
|
return (-TensorRemove(sum(trace(adj(Up) * Up2))).real() / U._grid->gSites());
|
||||||
|
#endif //USE_FFT_ACCELERATION
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void HotConfiguration(GridParallelRNG &pRNG, Field &U) {
|
static inline void HotConfiguration(GridParallelRNG &pRNG, Field &U) {
|
||||||
|
@ -30,119 +30,179 @@ directory
|
|||||||
#ifndef SCALAR_INT_ACTION_H
|
#ifndef SCALAR_INT_ACTION_H
|
||||||
#define SCALAR_INT_ACTION_H
|
#define SCALAR_INT_ACTION_H
|
||||||
|
|
||||||
|
|
||||||
// Note: this action can completely absorb the ScalarAction for real float fields
|
// Note: this action can completely absorb the ScalarAction for real float fields
|
||||||
// use the scalarObjs to generalise the structure
|
// use the scalarObjs to generalise the structure
|
||||||
|
|
||||||
namespace Grid {
|
namespace Grid
|
||||||
// FIXME drop the QCD namespace everywhere here
|
{
|
||||||
|
// FIXME drop the QCD namespace everywhere here
|
||||||
|
|
||||||
template <class Impl, int Ndim >
|
template <class Impl, int Ndim>
|
||||||
class ScalarInteractionAction : public QCD::Action<typename Impl::Field> {
|
class ScalarInteractionAction : public QCD::Action<typename Impl::Field>
|
||||||
public:
|
{
|
||||||
INHERIT_FIELD_TYPES(Impl);
|
public:
|
||||||
private:
|
INHERIT_FIELD_TYPES(Impl);
|
||||||
RealD mass_square;
|
|
||||||
RealD lambda;
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
RealD mass_square;
|
||||||
|
RealD lambda;
|
||||||
|
RealD g;
|
||||||
|
const unsigned int N = Impl::Group::Dimension;
|
||||||
|
|
||||||
typedef typename Field::vector_object vobj;
|
typedef typename Field::vector_object vobj;
|
||||||
typedef CartesianStencil<vobj,vobj> Stencil;
|
typedef CartesianStencil<vobj, vobj> Stencil;
|
||||||
|
|
||||||
SimpleCompressor<vobj> compressor;
|
SimpleCompressor<vobj> compressor;
|
||||||
int npoint = 2*Ndim;
|
int npoint = 2 * Ndim;
|
||||||
std::vector<int> directions;// = {0,1,2,3,0,1,2,3}; // forcing 4 dimensions
|
std::vector<int> directions; //
|
||||||
std::vector<int> displacements;// = {1,1,1,1, -1,-1,-1,-1};
|
std::vector<int> displacements; //
|
||||||
|
|
||||||
|
public:
|
||||||
public:
|
ScalarInteractionAction(RealD ms, RealD l, RealD gval) : mass_square(ms), lambda(l), g(gval), displacements(2 * Ndim, 0), directions(2 * Ndim, 0)
|
||||||
|
{
|
||||||
ScalarInteractionAction(RealD ms, RealD l) : mass_square(ms), lambda(l), displacements(2*Ndim,0), directions(2*Ndim,0){
|
for (int mu = 0; mu < Ndim; mu++)
|
||||||
for (int mu = 0 ; mu < Ndim; mu++){
|
{
|
||||||
directions[mu] = mu; directions[mu+Ndim] = mu;
|
directions[mu] = mu;
|
||||||
displacements[mu] = 1; displacements[mu+Ndim] = -1;
|
directions[mu + Ndim] = mu;
|
||||||
}
|
displacements[mu] = 1;
|
||||||
|
displacements[mu + Ndim] = -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
virtual std::string LogParameters() {
|
virtual std::string LogParameters()
|
||||||
std::stringstream sstream;
|
{
|
||||||
sstream << GridLogMessage << "[ScalarAction] lambda : " << lambda << std::endl;
|
std::stringstream sstream;
|
||||||
sstream << GridLogMessage << "[ScalarAction] mass_square : " << mass_square << std::endl;
|
sstream << GridLogMessage << "[ScalarAction] lambda : " << lambda << std::endl;
|
||||||
return sstream.str();
|
sstream << GridLogMessage << "[ScalarAction] mass_square : " << mass_square << std::endl;
|
||||||
}
|
sstream << GridLogMessage << "[ScalarAction] g : " << g << std::endl;
|
||||||
|
return sstream.str();
|
||||||
|
}
|
||||||
|
|
||||||
virtual std::string action_name() {return "ScalarAction";}
|
virtual std::string action_name() { return "ScalarAction"; }
|
||||||
|
|
||||||
virtual void refresh(const Field &U, GridParallelRNG &pRNG) {}
|
virtual void refresh(const Field &U, GridParallelRNG &pRNG) {}
|
||||||
|
|
||||||
virtual RealD S(const Field &p) {
|
virtual RealD S(const Field &p)
|
||||||
assert(p._grid->Nd() == Ndim);
|
{
|
||||||
static Stencil phiStencil(p._grid, npoint, 0, directions, displacements);
|
assert(p._grid->Nd() == Ndim);
|
||||||
phiStencil.HaloExchange(p, compressor);
|
static Stencil phiStencil(p._grid, npoint, 0, directions, displacements);
|
||||||
Field action(p._grid), pshift(p._grid), phisquared(p._grid);
|
phiStencil.HaloExchange(p, compressor);
|
||||||
phisquared = p*p;
|
Field action(p._grid), pshift(p._grid), phisquared(p._grid);
|
||||||
action = (2.0*Ndim + mass_square)*phisquared - lambda/24.*phisquared*phisquared;
|
phisquared = p * p;
|
||||||
for (int mu = 0; mu < Ndim; mu++) {
|
action = (2.0 * Ndim + mass_square) * phisquared - lambda * phisquared * phisquared;
|
||||||
// pshift = Cshift(p, mu, +1); // not efficient, implement with stencils
|
for (int mu = 0; mu < Ndim; mu++)
|
||||||
parallel_for (int i = 0; i < p._grid->oSites(); i++) {
|
{
|
||||||
int permute_type;
|
// pshift = Cshift(p, mu, +1); // not efficient, implement with stencils
|
||||||
StencilEntry *SE;
|
parallel_for(int i = 0; i < p._grid->oSites(); i++)
|
||||||
vobj temp2;
|
{
|
||||||
const vobj *temp, *t_p;
|
int permute_type;
|
||||||
|
StencilEntry *SE;
|
||||||
|
vobj temp2;
|
||||||
|
const vobj *temp, *t_p;
|
||||||
|
|
||||||
SE = phiStencil.GetEntry(permute_type, mu, i);
|
SE = phiStencil.GetEntry(permute_type, mu, i);
|
||||||
t_p = &p._odata[i];
|
t_p = &p._odata[i];
|
||||||
if ( SE->_is_local ) {
|
if (SE->_is_local)
|
||||||
temp = &p._odata[SE->_offset];
|
{
|
||||||
if ( SE->_permute ) {
|
temp = &p._odata[SE->_offset];
|
||||||
permute(temp2, *temp, permute_type);
|
if (SE->_permute)
|
||||||
action._odata[i] -= temp2*(*t_p) + (*t_p)*temp2;
|
{
|
||||||
} else {
|
permute(temp2, *temp, permute_type);
|
||||||
action._odata[i] -= (*temp)*(*t_p) + (*t_p)*(*temp);
|
action._odata[i] -= temp2 * (*t_p) + (*t_p) * temp2;
|
||||||
}
|
}
|
||||||
} else {
|
else
|
||||||
action._odata[i] -= phiStencil.CommBuf()[SE->_offset]*(*t_p) + (*t_p)*phiStencil.CommBuf()[SE->_offset];
|
{
|
||||||
}
|
action._odata[i] -= (*temp) * (*t_p) + (*t_p) * (*temp);
|
||||||
}
|
}
|
||||||
// action -= pshift*p + p*pshift;
|
}
|
||||||
}
|
else
|
||||||
// NB the trace in the algebra is normalised to 1/2
|
{
|
||||||
// minus sign coming from the antihermitian fields
|
action._odata[i] -= phiStencil.CommBuf()[SE->_offset] * (*t_p) + (*t_p) * phiStencil.CommBuf()[SE->_offset];
|
||||||
return -(TensorRemove(sum(trace(action)))).real();
|
}
|
||||||
};
|
|
||||||
|
|
||||||
virtual void deriv(const Field &p, Field &force) {
|
|
||||||
assert(p._grid->Nd() == Ndim);
|
|
||||||
force = (2.0*Ndim + mass_square)*p - lambda/12.*p*p*p;
|
|
||||||
// move this outside
|
|
||||||
static Stencil phiStencil(p._grid, npoint, 0, directions, displacements);
|
|
||||||
phiStencil.HaloExchange(p, compressor);
|
|
||||||
|
|
||||||
//for (int mu = 0; mu < QCD::Nd; mu++) force -= Cshift(p, mu, -1) + Cshift(p, mu, 1);
|
|
||||||
for (int point = 0; point < npoint; point++) {
|
|
||||||
parallel_for (int i = 0; i < p._grid->oSites(); i++) {
|
|
||||||
const vobj *temp;
|
|
||||||
vobj temp2;
|
|
||||||
int permute_type;
|
|
||||||
StencilEntry *SE;
|
|
||||||
SE = phiStencil.GetEntry(permute_type, point, i);
|
|
||||||
|
|
||||||
if ( SE->_is_local ) {
|
|
||||||
temp = &p._odata[SE->_offset];
|
|
||||||
if ( SE->_permute ) {
|
|
||||||
permute(temp2, *temp, permute_type);
|
|
||||||
force._odata[i] -= temp2;
|
|
||||||
} else {
|
|
||||||
force._odata[i] -= *temp;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
force._odata[i] -= phiStencil.CommBuf()[SE->_offset];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// action -= pshift*p + p*pshift;
|
||||||
}
|
}
|
||||||
|
// NB the trace in the algebra is normalised to 1/2
|
||||||
|
// minus sign coming from the antihermitian fields
|
||||||
|
return -(TensorRemove(sum(trace(action)))).real() * N / g;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Grid
|
virtual void deriv(const Field &p, Field &force)
|
||||||
|
{
|
||||||
|
double t0 = usecond();
|
||||||
|
assert(p._grid->Nd() == Ndim);
|
||||||
|
force = (2. * Ndim + mass_square) * p - 2. * lambda * p * p * p;
|
||||||
|
double interm_t = usecond();
|
||||||
|
|
||||||
#endif // SCALAR_INT_ACTION_H
|
// move this outside
|
||||||
|
static Stencil phiStencil(p._grid, npoint, 0, directions, displacements);
|
||||||
|
|
||||||
|
phiStencil.HaloExchange(p, compressor);
|
||||||
|
double halo_t = usecond();
|
||||||
|
int chunk = 128;
|
||||||
|
//for (int mu = 0; mu < QCD::Nd; mu++) force -= Cshift(p, mu, -1) + Cshift(p, mu, 1);
|
||||||
|
|
||||||
|
// inverting the order of the loops slows down the code(! g++ 7)
|
||||||
|
// cannot try to reduce the number of force writes by factor npoint...
|
||||||
|
// use cache blocking
|
||||||
|
for (int point = 0; point < npoint; point++)
|
||||||
|
{
|
||||||
|
|
||||||
|
#pragma omp parallel
|
||||||
|
{
|
||||||
|
int permute_type;
|
||||||
|
StencilEntry *SE;
|
||||||
|
const vobj *temp;
|
||||||
|
|
||||||
|
#pragma omp for schedule(static, chunk)
|
||||||
|
for (int i = 0; i < p._grid->oSites(); i++)
|
||||||
|
{
|
||||||
|
SE = phiStencil.GetEntry(permute_type, point, i);
|
||||||
|
// prefetch next p?
|
||||||
|
|
||||||
|
if (SE->_is_local)
|
||||||
|
{
|
||||||
|
temp = &p._odata[SE->_offset];
|
||||||
|
|
||||||
|
if (SE->_permute)
|
||||||
|
{
|
||||||
|
vobj temp2;
|
||||||
|
permute(temp2, *temp, permute_type);
|
||||||
|
force._odata[i] -= temp2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
force._odata[i] -= *temp; // slow part. Dominated by this read/write (BW)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
force._odata[i] -= phiStencil.CommBuf()[SE->_offset];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
force *= N / g;
|
||||||
|
|
||||||
|
double t1 = usecond();
|
||||||
|
double total_time = (t1 - t0) / 1e6;
|
||||||
|
double interm_time = (interm_t - t0) / 1e6;
|
||||||
|
double halo_time = (halo_t - interm_t) / 1e6;
|
||||||
|
double stencil_time = (t1 - halo_t) / 1e6;
|
||||||
|
std::cout << GridLogIntegrator << "Total time for force computation (s) : " << total_time << std::endl;
|
||||||
|
std::cout << GridLogIntegrator << "Intermediate time for force computation (s): " << interm_time << std::endl;
|
||||||
|
std::cout << GridLogIntegrator << "Halo time in force computation (s) : " << halo_time << std::endl;
|
||||||
|
std::cout << GridLogIntegrator << "Stencil time in force computation (s) : " << stencil_time << std::endl;
|
||||||
|
double flops = p._grid->gSites() * (14 * N * N * N + 18 * N * N + 2);
|
||||||
|
double flops_no_stencil = p._grid->gSites() * (14 * N * N * N + 6 * N * N + 2);
|
||||||
|
double Gflops = flops / (total_time * 1e9);
|
||||||
|
double Gflops_no_stencil = flops_no_stencil / (interm_time * 1e9);
|
||||||
|
std::cout << GridLogIntegrator << "Flops: " << flops << " - Gflop/s : " << Gflops << std::endl;
|
||||||
|
std::cout << GridLogIntegrator << "Flops NS: " << flops_no_stencil << " - Gflop/s NS: " << Gflops_no_stencil << std::endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Grid
|
||||||
|
|
||||||
|
#endif // SCALAR_INT_ACTION_H
|
||||||
|
@ -211,7 +211,7 @@ typedef HMCWrapperTemplate<ScalarAdjImplR, MinimumNorm2, ScalarMatrixFields>
|
|||||||
ScalarAdjGenericHMCRunner;
|
ScalarAdjGenericHMCRunner;
|
||||||
|
|
||||||
template <int Colours>
|
template <int Colours>
|
||||||
using ScalarNxNAdjGenericHMCRunner = HMCWrapperTemplate < ScalarNxNAdjImplR<Colours>, MinimumNorm2, ScalarNxNMatrixFields<Colours> >;
|
using ScalarNxNAdjGenericHMCRunner = HMCWrapperTemplate < ScalarNxNAdjImplR<Colours>, ForceGradient, ScalarNxNMatrixFields<Colours> >;
|
||||||
|
|
||||||
} // namespace QCD
|
} // namespace QCD
|
||||||
} // namespace Grid
|
} // namespace Grid
|
||||||
|
@ -92,6 +92,19 @@ class PlaquetteMod: public ObservableModule<PlaquetteLogger<Impl>, NoParameters>
|
|||||||
PlaquetteMod(): ObsBase(NoParameters()){}
|
PlaquetteMod(): ObsBase(NoParameters()){}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template < class Impl >
|
||||||
|
class PolyakovMod: public ObservableModule<PolyakovLogger<Impl>, NoParameters>{
|
||||||
|
typedef ObservableModule<PolyakovLogger<Impl>, NoParameters> ObsBase;
|
||||||
|
using ObsBase::ObsBase; // for constructors
|
||||||
|
|
||||||
|
// acquire resource
|
||||||
|
virtual void initialize(){
|
||||||
|
this->ObservablePtr.reset(new PolyakovLogger<Impl>());
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
PolyakovMod(): ObsBase(NoParameters()){}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
template < class Impl >
|
template < class Impl >
|
||||||
class TopologicalChargeMod: public ObservableModule<TopologicalCharge<Impl>, TopologyObsParameters>{
|
class TopologicalChargeMod: public ObservableModule<TopologicalCharge<Impl>, TopologyObsParameters>{
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user