mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-14 09:45:36 +00:00
Mobius Caley form, Mobius Zolotarev operators. Pass Even Odd vs unprec test and hermiticity checks
in tests/Grid_any_evenodd.cc; will work on inversion tests shortly.
This commit is contained in:
parent
35fdba81dd
commit
5916386242
@ -38,6 +38,9 @@
|
|||||||
//#include <qcd/action/fermion/PartialFraction.h>
|
//#include <qcd/action/fermion/PartialFraction.h>
|
||||||
|
|
||||||
#include <qcd/action/fermion/DomainWallFermion.h>
|
#include <qcd/action/fermion/DomainWallFermion.h>
|
||||||
|
#include <qcd/action/fermion/DomainWallFermion.h>
|
||||||
|
#include <qcd/action/fermion/MobiusFermion.h>
|
||||||
|
#include <qcd/action/fermion/MobiusZolotarevFermion.h>
|
||||||
//#include <qcd/action/fermion/ScaledShamirCayleyTanh.h>
|
//#include <qcd/action/fermion/ScaledShamirCayleyTanh.h>
|
||||||
|
|
||||||
|
|
||||||
@ -70,11 +73,6 @@
|
|||||||
|
|
||||||
class LinearGaugeAction : public GaugeAction< multi1d<LatticeColorMatrix>, multi1d<LatticeColorMatrix> >
|
class LinearGaugeAction : public GaugeAction< multi1d<LatticeColorMatrix>, multi1d<LatticeColorMatrix> >
|
||||||
typedef multi1d<LatticeColorMatrix> P;
|
typedef multi1d<LatticeColorMatrix> P;
|
||||||
typedef multi1d<LatticeColorMatrix> Q;
|
|
||||||
virtual void staple(LatticeColorMatrix& result,
|
|
||||||
const Handle< GaugeState<P,Q> >& state,
|
|
||||||
int mu, int cb) const = 0;
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -15,7 +15,6 @@ namespace QCD {
|
|||||||
FourDimRedBlackGrid,_M5),
|
FourDimRedBlackGrid,_M5),
|
||||||
mass(_mass)
|
mass(_mass)
|
||||||
{
|
{
|
||||||
std::cout << "Constructing a CayleyFermion5D"<<std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// override multiply
|
// override multiply
|
||||||
@ -230,6 +229,111 @@ namespace QCD {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CayleyFermion5D::SetCoefficients(RealD scale,Approx::zolotarev_data *zdata,RealD b,RealD c)
|
||||||
|
{
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// The Cayley coeffs (unprec)
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
omega.resize(Ls);
|
||||||
|
bs.resize(Ls);
|
||||||
|
cs.resize(Ls);
|
||||||
|
as.resize(Ls);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Ts = ( [bs+cs]Dw )^-1 ( (bs+cs) Dw )
|
||||||
|
// -(g5 ------- -1 ) ( g5 --------- + 1 )
|
||||||
|
// ( {2+(bs-cs)Dw} ) ( 2+(bs-cs) Dw )
|
||||||
|
//
|
||||||
|
// bs = 1/2( (1/omega_s + 1)*b + (1/omega - 1)*c ) = 1/2( 1/omega(b+c) + (b-c) )
|
||||||
|
// cs = 1/2( (1/omega_s - 1)*b + (1/omega + 1)*c ) = 1/2( 1/omega(b+c) - (b-c) )
|
||||||
|
//
|
||||||
|
// bs+cs = 0.5*( 1/omega(b+c) + (b-c) + 1/omega(b+c) - (b-c) ) = 1/omega(b+c)
|
||||||
|
// bs-cs = 0.5*( 1/omega(b+c) + (b-c) - 1/omega(b+c) + (b-c) ) = b-c
|
||||||
|
//
|
||||||
|
// So
|
||||||
|
//
|
||||||
|
// Ts = ( [b+c]Dw/omega_s )^-1 ( (b+c) Dw /omega_s )
|
||||||
|
// -(g5 ------- -1 ) ( g5 --------- + 1 )
|
||||||
|
// ( {2+(b-c)Dw} ) ( 2+(b-c) Dw )
|
||||||
|
//
|
||||||
|
// Ts = ( [b+c]Dw )^-1 ( (b+c) Dw )
|
||||||
|
// -(g5 ------- -omega_s) ( g5 --------- + omega_s )
|
||||||
|
// ( {2+(b-c)Dw} ) ( 2+(b-c) Dw )
|
||||||
|
//
|
||||||
|
|
||||||
|
double bpc = b+c;
|
||||||
|
double bmc = b-c;
|
||||||
|
for(int i=0; i < Ls; i++){
|
||||||
|
as[i] = 1.0;
|
||||||
|
omega[i] = ((double)zdata->gamma[i]); //NB reciprocal relative to Chroma NEF code
|
||||||
|
bs[i] = 0.5*(bpc/omega[i] + bmc);
|
||||||
|
cs[i] = 0.5*(bpc/omega[i] - bmc);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
// Constants for the preconditioned matrix Cayley form
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
bee.resize(Ls);
|
||||||
|
cee.resize(Ls);
|
||||||
|
beo.resize(Ls);
|
||||||
|
ceo.resize(Ls);
|
||||||
|
|
||||||
|
for(int i=0;i<Ls;i++){
|
||||||
|
bee[i]=as[i]*(bs[i]*(4.0-M5) +1.0);
|
||||||
|
cee[i]=as[i]*(1.0-cs[i]*(4.0-M5));
|
||||||
|
beo[i]=as[i]*bs[i];
|
||||||
|
ceo[i]=-as[i]*cs[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
aee.resize(Ls);
|
||||||
|
aeo.resize(Ls);
|
||||||
|
for(int i=0;i<Ls;i++){
|
||||||
|
aee[i]=cee[i];
|
||||||
|
aeo[i]=ceo[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////
|
||||||
|
// LDU decomposition of eeoo
|
||||||
|
//////////////////////////////////////////
|
||||||
|
dee.resize(Ls);
|
||||||
|
lee.resize(Ls);
|
||||||
|
leem.resize(Ls);
|
||||||
|
uee.resize(Ls);
|
||||||
|
ueem.resize(Ls);
|
||||||
|
|
||||||
|
for(int i=0;i<Ls;i++){
|
||||||
|
|
||||||
|
dee[i] = bee[i];
|
||||||
|
|
||||||
|
if ( i < Ls-1 ) {
|
||||||
|
|
||||||
|
lee[i] =-cee[i+1]/bee[i]; // sub-diag entry on the ith column
|
||||||
|
|
||||||
|
leem[i]=mass*cee[Ls-1]/bee[0];
|
||||||
|
for(int j=0;j<i;j++) leem[i]*= aee[j]/bee[j+1];
|
||||||
|
|
||||||
|
uee[i] =-aee[i]/bee[i]; // up-diag entry on the ith row
|
||||||
|
|
||||||
|
ueem[i]=mass;
|
||||||
|
for(int j=1;j<=i;j++) ueem[i]*= cee[j]/bee[j];
|
||||||
|
ueem[i]*= aee[0]/bee[0];
|
||||||
|
|
||||||
|
} else {
|
||||||
|
lee[i] =0.0;
|
||||||
|
leem[i]=0.0;
|
||||||
|
uee[i] =0.0;
|
||||||
|
ueem[i]=0.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
double delta_d=mass*cee[Ls-1];
|
||||||
|
for(int j=0;j<Ls-1;j++) delta_d *= cee[j]/bee[j];
|
||||||
|
dee[Ls-1] += delta_d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,10 +22,8 @@ namespace Grid {
|
|||||||
virtual void MooeeInvDag (const LatticeFermion &in, LatticeFermion &out);
|
virtual void MooeeInvDag (const LatticeFermion &in, LatticeFermion &out);
|
||||||
|
|
||||||
// protected:
|
// protected:
|
||||||
|
|
||||||
Approx::zolotarev_data *zdata;
|
|
||||||
|
|
||||||
RealD mass;
|
RealD mass;
|
||||||
|
|
||||||
// Cayley form Moebius (tanh and zolotarev)
|
// Cayley form Moebius (tanh and zolotarev)
|
||||||
std::vector<RealD> omega;
|
std::vector<RealD> omega;
|
||||||
std::vector<RealD> bs; // S dependent coeffs
|
std::vector<RealD> bs; // S dependent coeffs
|
||||||
@ -53,6 +51,8 @@ namespace Grid {
|
|||||||
GridRedBlackCartesian &FourDimRedBlackGrid,
|
GridRedBlackCartesian &FourDimRedBlackGrid,
|
||||||
RealD _mass,RealD _M5);
|
RealD _mass,RealD _M5);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void SetCoefficients(RealD scale,Approx::zolotarev_data *zdata,RealD b,RealD c);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -28,86 +28,13 @@ namespace Grid {
|
|||||||
{
|
{
|
||||||
RealD eps = 1.0;
|
RealD eps = 1.0;
|
||||||
|
|
||||||
zdata = Approx::grid_higham(eps,this->Ls);// eps is ignored for higham
|
Approx::zolotarev_data *zdata = Approx::grid_higham(eps,this->Ls);// eps is ignored for higham
|
||||||
assert(zdata->n==this->Ls);
|
assert(zdata->n==this->Ls);
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
std::cout << "DomainWallFermion with Ls="<<Ls<<std::endl;
|
||||||
// The Cayley coeffs (unprec)
|
// Call base setter
|
||||||
///////////////////////////////////////////////////////////
|
this->CayleyFermion5D::SetCoefficients(1.0,zdata,1.0,0.0);
|
||||||
this->omega.resize(this->Ls);
|
|
||||||
this->bs.resize(this->Ls);
|
|
||||||
this->cs.resize(this->Ls);
|
|
||||||
this->as.resize(this->Ls);
|
|
||||||
|
|
||||||
for(int i=0; i < this->Ls; i++){
|
|
||||||
this->as[i] = 1.0;
|
|
||||||
this->omega[i] = ((double)zdata -> gamma[i]);
|
|
||||||
double bb=1.0;
|
|
||||||
this->bs[i] = 0.5*(bb/(this->omega[i]) + 1.0);
|
|
||||||
this->cs[i] = 0.5*(bb/(this->omega[i]) - 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
// Constants for the preconditioned matrix Cayley form
|
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
this->bee.resize(this->Ls);
|
|
||||||
this->cee.resize(this->Ls);
|
|
||||||
this->beo.resize(this->Ls);
|
|
||||||
this->ceo.resize(this->Ls);
|
|
||||||
|
|
||||||
for(int i=0;i<this->Ls;i++){
|
|
||||||
this->bee[i]=as[i]*(bs[i]*(4.0-M5) +1.0);
|
|
||||||
this->cee[i]=as[i]*(1.0-cs[i]*(4.0-M5));
|
|
||||||
this->beo[i]=as[i]*bs[i];
|
|
||||||
this->ceo[i]=-as[i]*cs[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
aee.resize(this->Ls);
|
|
||||||
aeo.resize(this->Ls);
|
|
||||||
for(int i=0;i<this->Ls;i++){
|
|
||||||
aee[i]=cee[i];
|
|
||||||
aeo[i]=ceo[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////
|
|
||||||
// LDU decomposition of eeoo
|
|
||||||
//////////////////////////////////////////
|
|
||||||
dee.resize(this->Ls);
|
|
||||||
lee.resize(this->Ls);
|
|
||||||
leem.resize(this->Ls);
|
|
||||||
uee.resize(this->Ls);
|
|
||||||
ueem.resize(this->Ls);
|
|
||||||
|
|
||||||
for(int i=0;i<this->Ls;i++){
|
|
||||||
|
|
||||||
dee[i] = bee[i];
|
|
||||||
|
|
||||||
if ( i < this->Ls-1 ) {
|
|
||||||
|
|
||||||
lee[i] =-cee[i+1]/bee[i]; // sub-diag entry on the ith column
|
|
||||||
|
|
||||||
leem[i]=this->mass*cee[this->Ls-1]/bee[0];
|
|
||||||
for(int j=0;j<i;j++) leem[i]*= aee[j]/bee[j+1];
|
|
||||||
|
|
||||||
uee[i] =-aee[i]/bee[i]; // up-diag entry on the ith row
|
|
||||||
|
|
||||||
ueem[i]=this->mass;
|
|
||||||
for(int j=1;j<=i;j++) ueem[i]*= cee[j]/bee[j];
|
|
||||||
ueem[i]*= aee[0]/bee[0];
|
|
||||||
|
|
||||||
} else {
|
|
||||||
lee[i] =0.0;
|
|
||||||
leem[i]=0.0;
|
|
||||||
uee[i] =0.0;
|
|
||||||
ueem[i]=0.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
double delta_d=mass*cee[this->Ls-1];
|
|
||||||
for(int j=0;j<this->Ls-1;j++) delta_d *= cee[j]/bee[j];
|
|
||||||
dee[this->Ls-1] += delta_d;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
46
lib/qcd/action/fermion/MobiusFermion.h
Normal file
46
lib/qcd/action/fermion/MobiusFermion.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#ifndef GRID_QCD_MOBIUS_FERMION_H
|
||||||
|
#define GRID_QCD_MOBIUS_FERMION_H
|
||||||
|
|
||||||
|
#include <Grid.h>
|
||||||
|
|
||||||
|
namespace Grid {
|
||||||
|
|
||||||
|
namespace QCD {
|
||||||
|
|
||||||
|
class MobiusFermion : public CayleyFermion5D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
MobiusFermion(LatticeGaugeField &_Umu,
|
||||||
|
GridCartesian &FiveDimGrid,
|
||||||
|
GridRedBlackCartesian &FiveDimRedBlackGrid,
|
||||||
|
GridCartesian &FourDimGrid,
|
||||||
|
GridRedBlackCartesian &FourDimRedBlackGrid,
|
||||||
|
RealD _mass,RealD _M5,
|
||||||
|
RealD b, RealD c) :
|
||||||
|
|
||||||
|
CayleyFermion5D(_Umu,
|
||||||
|
FiveDimGrid,
|
||||||
|
FiveDimRedBlackGrid,
|
||||||
|
FourDimGrid,
|
||||||
|
FourDimRedBlackGrid,_mass,_M5)
|
||||||
|
|
||||||
|
{
|
||||||
|
RealD eps = 1.0;
|
||||||
|
|
||||||
|
std::cout << "MobiusFermion (b="<<b<<",c="<<c<<") with Ls= "<<Ls<<" Tanh approx"<<std::endl;
|
||||||
|
Approx::zolotarev_data *zdata = Approx::grid_higham(eps,this->Ls);// eps is ignored for higham
|
||||||
|
assert(zdata->n==this->Ls);
|
||||||
|
|
||||||
|
// Call base setter
|
||||||
|
this->CayleyFermion5D::SetCoefficients(1.0,zdata,b,c);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
48
lib/qcd/action/fermion/MobiusZolotarevFermion.h
Normal file
48
lib/qcd/action/fermion/MobiusZolotarevFermion.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#ifndef GRID_QCD_MOBIUS_ZOLOTAREV_FERMION_H
|
||||||
|
#define GRID_QCD_MOBIUS_ZOLOTAREV_FERMION_H
|
||||||
|
|
||||||
|
#include <Grid.h>
|
||||||
|
|
||||||
|
namespace Grid {
|
||||||
|
|
||||||
|
namespace QCD {
|
||||||
|
|
||||||
|
class MobiusZolotarevFermion : public CayleyFermion5D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
MobiusZolotarevFermion(LatticeGaugeField &_Umu,
|
||||||
|
GridCartesian &FiveDimGrid,
|
||||||
|
GridRedBlackCartesian &FiveDimRedBlackGrid,
|
||||||
|
GridCartesian &FourDimGrid,
|
||||||
|
GridRedBlackCartesian &FourDimRedBlackGrid,
|
||||||
|
RealD _mass,RealD _M5,
|
||||||
|
RealD b, RealD c,
|
||||||
|
RealD lo, RealD hi) :
|
||||||
|
|
||||||
|
CayleyFermion5D(_Umu,
|
||||||
|
FiveDimGrid,
|
||||||
|
FiveDimRedBlackGrid,
|
||||||
|
FourDimGrid,
|
||||||
|
FourDimRedBlackGrid,_mass,_M5)
|
||||||
|
|
||||||
|
{
|
||||||
|
RealD eps = lo/hi;
|
||||||
|
|
||||||
|
Approx::zolotarev_data *zdata = Approx::grid_zolotarev(eps,this->Ls,0);// eps is ignored for higham
|
||||||
|
assert(zdata->n==this->Ls);
|
||||||
|
|
||||||
|
std::cout << "MobiusZolotarevFermion (b="<<b<<",c="<<c<<") with Ls= "<<Ls<<" Zolotarev range ["<<lo<<","<<hi<<"]"<<std::endl;
|
||||||
|
|
||||||
|
// Call base setter
|
||||||
|
this->CayleyFermion5D::SetCoefficients(1.0,zdata,b,c);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
51
lib/qcd/action/fermion/ScaledShamir.h
Normal file
51
lib/qcd/action/fermion/ScaledShamir.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#ifndef GRID_QCD_DOMAIN_WALL_FERMION_H
|
||||||
|
#define GRID_QCD_DOMAIN_WALL_FERMION_H
|
||||||
|
|
||||||
|
#include <Grid.h>
|
||||||
|
|
||||||
|
namespace Grid {
|
||||||
|
|
||||||
|
namespace QCD {
|
||||||
|
|
||||||
|
class ScaledShamirFermion : public CayleyFermion5D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
ScaledShamirFermion(LatticeGaugeField &_Umu,
|
||||||
|
GridCartesian &FiveDimGrid,
|
||||||
|
GridRedBlackCartesian &FiveDimRedBlackGrid,
|
||||||
|
GridCartesian &FourDimGrid,
|
||||||
|
GridRedBlackCartesian &FourDimRedBlackGrid,
|
||||||
|
RealD _mass,RealD _M5, RealD scale) :
|
||||||
|
|
||||||
|
CayleyFermion5D(_Umu,
|
||||||
|
FiveDimGrid,
|
||||||
|
FiveDimRedBlackGrid,
|
||||||
|
FourDimGrid,
|
||||||
|
FourDimRedBlackGrid,_mass,_M5,
|
||||||
|
RealD b,
|
||||||
|
RealD c)
|
||||||
|
|
||||||
|
{
|
||||||
|
RealD eps = 1.0;
|
||||||
|
|
||||||
|
Approx::zolotarev_data *zdata = Approx::grid_higham(eps,this->Ls);// eps is ignored for higham
|
||||||
|
assert(zdata->n==this->Ls);
|
||||||
|
|
||||||
|
//b+c = scale;
|
||||||
|
//b-c = 1
|
||||||
|
//b = 0.5(scale+1);
|
||||||
|
//c = 0.5(scale-1);
|
||||||
|
|
||||||
|
// Call base setter
|
||||||
|
this->CayleyFermion5D::SetCoefficients(1.0,zdata,0.5*(scale+1.0),0.5*(scale-1.0));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -14,6 +14,18 @@ namespace Grid {
|
|||||||
// i.e. even even contains fifth dim hopping term.
|
// i.e. even even contains fifth dim hopping term.
|
||||||
//
|
//
|
||||||
// [DIFFERS from original CPS red black implementation parity = (x+y+z+t+s)|2 ]
|
// [DIFFERS from original CPS red black implementation parity = (x+y+z+t+s)|2 ]
|
||||||
|
////////////////////////////
|
||||||
|
//ContFrac:
|
||||||
|
// Ls always odd. Rational poly deg is either Ls or Ls-1
|
||||||
|
//PartFrac
|
||||||
|
// Ls always odd. Rational poly deg is either Ls or Ls-1
|
||||||
|
//
|
||||||
|
//Cayley: Ls always even, Rational poly deg is Ls
|
||||||
|
//
|
||||||
|
// Just set nrational as Ls. Forget about Ls-1 cases.
|
||||||
|
//
|
||||||
|
// Require odd Ls for cont and part frac
|
||||||
|
////////////////////////////
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
class WilsonFermion5D : public FermionOperator<LatticeFermion,LatticeGaugeField>
|
class WilsonFermion5D : public FermionOperator<LatticeFermion,LatticeGaugeField>
|
||||||
{
|
{
|
||||||
|
226
tests/Grid_any_evenodd.cc
Normal file
226
tests/Grid_any_evenodd.cc
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
#include <Grid.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace Grid;
|
||||||
|
using namespace Grid::QCD;
|
||||||
|
|
||||||
|
template<class d>
|
||||||
|
struct scal {
|
||||||
|
d internal;
|
||||||
|
};
|
||||||
|
|
||||||
|
Gamma::GammaMatrix Gmu [] = {
|
||||||
|
Gamma::GammaX,
|
||||||
|
Gamma::GammaY,
|
||||||
|
Gamma::GammaZ,
|
||||||
|
Gamma::GammaT
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<class What>
|
||||||
|
void TestWhat(What & Ddwf,
|
||||||
|
GridCartesian * FGrid, GridRedBlackCartesian * FrbGrid,
|
||||||
|
GridCartesian * UGrid, GridRedBlackCartesian * UrbGrid,
|
||||||
|
RealD mass, RealD M5,
|
||||||
|
GridParallelRNG *RNG4, GridParallelRNG *RNG5);
|
||||||
|
|
||||||
|
int main (int argc, char ** argv)
|
||||||
|
{
|
||||||
|
Grid_init(&argc,&argv);
|
||||||
|
|
||||||
|
int threads = GridThread::GetThreads();
|
||||||
|
std::cout << "Grid is setup to use "<<threads<<" threads"<<std::endl;
|
||||||
|
|
||||||
|
const int Ls=8;
|
||||||
|
GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexF::Nsimd()),GridDefaultMpi());
|
||||||
|
GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
|
||||||
|
GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
|
||||||
|
GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<int> seeds4({1,2,3,4});
|
||||||
|
std::vector<int> seeds5({5,6,7,8});
|
||||||
|
GridParallelRNG RNG5(FGrid); RNG5.SeedFixedIntegers(seeds5);
|
||||||
|
GridParallelRNG RNG4(UGrid); RNG4.SeedFixedIntegers(seeds4);
|
||||||
|
|
||||||
|
LatticeGaugeField Umu(UGrid); random(RNG4,Umu);
|
||||||
|
std::vector<LatticeColourMatrix> U(4,UGrid);
|
||||||
|
|
||||||
|
RealD mass=0.1;
|
||||||
|
RealD M5 =1.8;
|
||||||
|
DomainWallFermion Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5);
|
||||||
|
TestWhat<DomainWallFermion>(Ddwf,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
|
||||||
|
|
||||||
|
RealD b=1.5;// Scale factor b+c=2, b-c=1
|
||||||
|
RealD c=0.5;
|
||||||
|
MobiusFermion Dmob(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,b,c);
|
||||||
|
TestWhat<MobiusFermion>(Dmob,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
|
||||||
|
|
||||||
|
MobiusZolotarevFermion Dzolo(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,b,c,0.1,4.0);
|
||||||
|
TestWhat<MobiusZolotarevFermion>(Dzolo,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
|
||||||
|
|
||||||
|
|
||||||
|
Grid_finalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class What>
|
||||||
|
void TestWhat(What & Ddwf,
|
||||||
|
GridCartesian * FGrid, GridRedBlackCartesian * FrbGrid,
|
||||||
|
GridCartesian * UGrid, GridRedBlackCartesian * UrbGrid,
|
||||||
|
RealD mass, RealD M5,
|
||||||
|
GridParallelRNG *RNG4,
|
||||||
|
GridParallelRNG *RNG5)
|
||||||
|
{
|
||||||
|
|
||||||
|
LatticeFermion src (FGrid); random(*RNG5,src);
|
||||||
|
LatticeFermion phi (FGrid); random(*RNG5,phi);
|
||||||
|
LatticeFermion chi (FGrid); random(*RNG5,chi);
|
||||||
|
LatticeFermion result(FGrid); result=zero;
|
||||||
|
LatticeFermion ref(FGrid); ref=zero;
|
||||||
|
LatticeFermion tmp(FGrid); tmp=zero;
|
||||||
|
LatticeFermion err(FGrid); tmp=zero;
|
||||||
|
|
||||||
|
LatticeFermion src_e (FrbGrid);
|
||||||
|
LatticeFermion src_o (FrbGrid);
|
||||||
|
LatticeFermion r_e (FrbGrid);
|
||||||
|
LatticeFermion r_o (FrbGrid);
|
||||||
|
LatticeFermion r_eo (FGrid);
|
||||||
|
LatticeFermion r_eeoo(FGrid);
|
||||||
|
|
||||||
|
std::cout<<"=========================================================="<<std::endl;
|
||||||
|
std::cout<<"= Testing that Meo + Moe + Moo + Mee = Munprec "<<std::endl;
|
||||||
|
std::cout<<"=========================================================="<<std::endl;
|
||||||
|
|
||||||
|
pickCheckerboard(Even,src_e,src);
|
||||||
|
pickCheckerboard(Odd,src_o,src);
|
||||||
|
|
||||||
|
Ddwf.Meooe(src_e,r_o); std::cout<<"Applied Meo"<<std::endl;
|
||||||
|
Ddwf.Meooe(src_o,r_e); std::cout<<"Applied Moe"<<std::endl;
|
||||||
|
setCheckerboard(r_eo,r_o);
|
||||||
|
setCheckerboard(r_eo,r_e);
|
||||||
|
|
||||||
|
Ddwf.Mooee(src_e,r_e); std::cout<<"Applied Mee"<<std::endl;
|
||||||
|
Ddwf.Mooee(src_o,r_o); std::cout<<"Applied Moo"<<std::endl;
|
||||||
|
setCheckerboard(r_eeoo,r_e);
|
||||||
|
setCheckerboard(r_eeoo,r_o);
|
||||||
|
|
||||||
|
r_eo=r_eo+r_eeoo;
|
||||||
|
Ddwf.M(src,ref);
|
||||||
|
|
||||||
|
// std::cout << r_eo<<std::endl;
|
||||||
|
// std::cout << ref <<std::endl;
|
||||||
|
|
||||||
|
err= ref - r_eo;
|
||||||
|
std::cout << "EO norm diff "<< norm2(err)<< " "<<norm2(ref)<< " " << norm2(r_eo) <<std::endl;
|
||||||
|
|
||||||
|
LatticeComplex cerr(FGrid);
|
||||||
|
cerr = localInnerProduct(err,err);
|
||||||
|
// std::cout << cerr<<std::endl;
|
||||||
|
|
||||||
|
std::cout<<"=============================================================="<<std::endl;
|
||||||
|
std::cout<<"= Test Ddagger is the dagger of D by requiring "<<std::endl;
|
||||||
|
std::cout<<"= < phi | Deo | chi > * = < chi | Deo^dag| phi> "<<std::endl;
|
||||||
|
std::cout<<"=============================================================="<<std::endl;
|
||||||
|
|
||||||
|
LatticeFermion chi_e (FrbGrid);
|
||||||
|
LatticeFermion chi_o (FrbGrid);
|
||||||
|
|
||||||
|
LatticeFermion dchi_e (FrbGrid);
|
||||||
|
LatticeFermion dchi_o (FrbGrid);
|
||||||
|
|
||||||
|
LatticeFermion phi_e (FrbGrid);
|
||||||
|
LatticeFermion phi_o (FrbGrid);
|
||||||
|
|
||||||
|
LatticeFermion dphi_e (FrbGrid);
|
||||||
|
LatticeFermion dphi_o (FrbGrid);
|
||||||
|
|
||||||
|
|
||||||
|
pickCheckerboard(Even,chi_e,chi);
|
||||||
|
pickCheckerboard(Odd ,chi_o,chi);
|
||||||
|
pickCheckerboard(Even,phi_e,phi);
|
||||||
|
pickCheckerboard(Odd ,phi_o,phi);
|
||||||
|
|
||||||
|
Ddwf.Meooe(chi_e,dchi_o);
|
||||||
|
Ddwf.Meooe(chi_o,dchi_e);
|
||||||
|
Ddwf.MeooeDag(phi_e,dphi_o);
|
||||||
|
Ddwf.MeooeDag(phi_o,dphi_e);
|
||||||
|
|
||||||
|
ComplexD pDce = innerProduct(phi_e,dchi_e);
|
||||||
|
ComplexD pDco = innerProduct(phi_o,dchi_o);
|
||||||
|
ComplexD cDpe = innerProduct(chi_e,dphi_e);
|
||||||
|
ComplexD cDpo = innerProduct(chi_o,dphi_o);
|
||||||
|
|
||||||
|
std::cout <<"e "<<pDce<<" "<<cDpe <<std::endl;
|
||||||
|
std::cout <<"o "<<pDco<<" "<<cDpo <<std::endl;
|
||||||
|
|
||||||
|
std::cout <<"pDce - conj(cDpo) "<< pDce-conj(cDpo) <<std::endl;
|
||||||
|
std::cout <<"pDco - conj(cDpe) "<< pDco-conj(cDpe) <<std::endl;
|
||||||
|
|
||||||
|
std::cout<<"=============================================================="<<std::endl;
|
||||||
|
std::cout<<"= Test MeeInv Mee = 1 "<<std::endl;
|
||||||
|
std::cout<<"=============================================================="<<std::endl;
|
||||||
|
|
||||||
|
pickCheckerboard(Even,chi_e,chi);
|
||||||
|
pickCheckerboard(Odd ,chi_o,chi);
|
||||||
|
|
||||||
|
Ddwf.Mooee(chi_e,src_e);
|
||||||
|
Ddwf.MooeeInv(src_e,phi_e);
|
||||||
|
|
||||||
|
Ddwf.Mooee(chi_o,src_o);
|
||||||
|
Ddwf.MooeeInv(src_o,phi_o);
|
||||||
|
|
||||||
|
setCheckerboard(phi,phi_e);
|
||||||
|
setCheckerboard(phi,phi_o);
|
||||||
|
|
||||||
|
err = phi-chi;
|
||||||
|
std::cout << "norm diff "<< norm2(err)<< std::endl;
|
||||||
|
|
||||||
|
std::cout<<"=============================================================="<<std::endl;
|
||||||
|
std::cout<<"= Test MeeInvDag MeeDag = 1 "<<std::endl;
|
||||||
|
std::cout<<"=============================================================="<<std::endl;
|
||||||
|
|
||||||
|
pickCheckerboard(Even,chi_e,chi);
|
||||||
|
pickCheckerboard(Odd ,chi_o,chi);
|
||||||
|
|
||||||
|
Ddwf.MooeeDag(chi_e,src_e);
|
||||||
|
Ddwf.MooeeInvDag(src_e,phi_e);
|
||||||
|
|
||||||
|
Ddwf.MooeeDag(chi_o,src_o);
|
||||||
|
Ddwf.MooeeInvDag(src_o,phi_o);
|
||||||
|
|
||||||
|
setCheckerboard(phi,phi_e);
|
||||||
|
setCheckerboard(phi,phi_o);
|
||||||
|
|
||||||
|
err = phi-chi;
|
||||||
|
std::cout << "norm diff "<< norm2(err)<< std::endl;
|
||||||
|
|
||||||
|
std::cout<<"=============================================================="<<std::endl;
|
||||||
|
std::cout<<"= Test MpcDagMpc is Hermitian "<<std::endl;
|
||||||
|
std::cout<<"=============================================================="<<std::endl;
|
||||||
|
|
||||||
|
random(*RNG5,phi);
|
||||||
|
random(*RNG5,chi);
|
||||||
|
pickCheckerboard(Even,chi_e,chi);
|
||||||
|
pickCheckerboard(Odd ,chi_o,chi);
|
||||||
|
pickCheckerboard(Even,phi_e,phi);
|
||||||
|
pickCheckerboard(Odd ,phi_o,phi);
|
||||||
|
RealD t1,t2;
|
||||||
|
|
||||||
|
Ddwf.MpcDagMpc(chi_e,dchi_e,t1,t2);
|
||||||
|
Ddwf.MpcDagMpc(chi_o,dchi_o,t1,t2);
|
||||||
|
|
||||||
|
Ddwf.MpcDagMpc(phi_e,dphi_e,t1,t2);
|
||||||
|
Ddwf.MpcDagMpc(phi_o,dphi_o,t1,t2);
|
||||||
|
|
||||||
|
pDce = innerProduct(phi_e,dchi_e);
|
||||||
|
pDco = innerProduct(phi_o,dchi_o);
|
||||||
|
cDpe = innerProduct(chi_e,dphi_e);
|
||||||
|
cDpo = innerProduct(chi_o,dphi_o);
|
||||||
|
|
||||||
|
std::cout <<"e "<<pDce<<" "<<cDpe <<std::endl;
|
||||||
|
std::cout <<"o "<<pDco<<" "<<cDpo <<std::endl;
|
||||||
|
|
||||||
|
std::cout <<"pDce - conj(cDpo) "<< pDco-conj(cDpo) <<std::endl;
|
||||||
|
std::cout <<"pDco - conj(cDpe) "<< pDce-conj(cDpe) <<std::endl;
|
||||||
|
|
||||||
|
}
|
@ -22,13 +22,10 @@ bin_PROGRAMS = Grid_main \
|
|||||||
Grid_dwf_even_odd\
|
Grid_dwf_even_odd\
|
||||||
Grid_dwf_cg_unprec\
|
Grid_dwf_cg_unprec\
|
||||||
Grid_dwf_cg_prec\
|
Grid_dwf_cg_prec\
|
||||||
Grid_dwf_cg_schur
|
Grid_dwf_cg_schur\
|
||||||
|
Grid_any_evenodd
|
||||||
|
|
||||||
|
|
||||||
test:
|
|
||||||
for f in $bin_PROGRAMS
|
|
||||||
do
|
|
||||||
./$f > $f.log
|
|
||||||
done
|
|
||||||
|
|
||||||
Grid_main_SOURCES = Grid_main.cc
|
Grid_main_SOURCES = Grid_main.cc
|
||||||
Grid_main_LDADD = -lGrid
|
Grid_main_LDADD = -lGrid
|
||||||
@ -66,6 +63,9 @@ Grid_simd_LDADD = -lGrid
|
|||||||
Grid_wilson_evenodd_SOURCES = Grid_wilson_evenodd.cc
|
Grid_wilson_evenodd_SOURCES = Grid_wilson_evenodd.cc
|
||||||
Grid_wilson_evenodd_LDADD = -lGrid
|
Grid_wilson_evenodd_LDADD = -lGrid
|
||||||
|
|
||||||
|
Grid_any_evenodd_SOURCES = Grid_any_evenodd.cc
|
||||||
|
Grid_any_evenodd_LDADD = -lGrid
|
||||||
|
|
||||||
Grid_wilson_cg_unprec_SOURCES = Grid_wilson_cg_unprec.cc
|
Grid_wilson_cg_unprec_SOURCES = Grid_wilson_cg_unprec.cc
|
||||||
Grid_wilson_cg_unprec_LDADD = -lGrid
|
Grid_wilson_cg_unprec_LDADD = -lGrid
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user