mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-14 01:35:36 +00:00
Added untraced baryon contraction code
This commit is contained in:
parent
3362f8dfa0
commit
463d72d322
@ -61,6 +61,16 @@ public:
|
|||||||
const int parity,
|
const int parity,
|
||||||
const bool * wick_contractions,
|
const bool * wick_contractions,
|
||||||
robj &result);
|
robj &result);
|
||||||
|
template <class mobj, class robj>
|
||||||
|
static void baryon_site_matrix(const mobj &D1,
|
||||||
|
const mobj &D2,
|
||||||
|
const mobj &D3,
|
||||||
|
const Gamma GammaA_left,
|
||||||
|
const Gamma GammaB_left,
|
||||||
|
const Gamma GammaA_right,
|
||||||
|
const Gamma GammaB_right,
|
||||||
|
const bool * wick_contractions,
|
||||||
|
robj &result);
|
||||||
public:
|
public:
|
||||||
static void Wick_Contractions(std::string qi,
|
static void Wick_Contractions(std::string qi,
|
||||||
std::string qf,
|
std::string qf,
|
||||||
@ -75,6 +85,15 @@ public:
|
|||||||
const bool* wick_contractions,
|
const bool* wick_contractions,
|
||||||
const int parity,
|
const int parity,
|
||||||
ComplexField &baryon_corr);
|
ComplexField &baryon_corr);
|
||||||
|
static void ContractBaryons_matrix(const PropagatorField &q1_left,
|
||||||
|
const PropagatorField &q2_left,
|
||||||
|
const PropagatorField &q3_left,
|
||||||
|
const Gamma GammaA_left,
|
||||||
|
const Gamma GammaB_left,
|
||||||
|
const Gamma GammaA_right,
|
||||||
|
const Gamma GammaB_right,
|
||||||
|
const bool* wick_contractions,
|
||||||
|
SpinMatrixField &baryon_corr);
|
||||||
template <class mobj, class robj>
|
template <class mobj, class robj>
|
||||||
static void ContractBaryons_Sliced(const mobj &D1,
|
static void ContractBaryons_Sliced(const mobj &D1,
|
||||||
const mobj &D2,
|
const mobj &D2,
|
||||||
@ -87,6 +106,17 @@ public:
|
|||||||
const int parity,
|
const int parity,
|
||||||
const int nt,
|
const int nt,
|
||||||
robj &result);
|
robj &result);
|
||||||
|
template <class mobj, class robj>
|
||||||
|
static void ContractBaryons_Sliced_matrix(const mobj &D1,
|
||||||
|
const mobj &D2,
|
||||||
|
const mobj &D3,
|
||||||
|
const Gamma GammaA_left,
|
||||||
|
const Gamma GammaB_left,
|
||||||
|
const Gamma GammaA_right,
|
||||||
|
const Gamma GammaB_right,
|
||||||
|
const bool* wick_contractions,
|
||||||
|
const int nt,
|
||||||
|
robj &result);
|
||||||
private:
|
private:
|
||||||
template <class mobj, class mobj2, class robj>
|
template <class mobj, class mobj2, class robj>
|
||||||
static void Baryon_Gamma_3pt_Group1_Site(
|
static void Baryon_Gamma_3pt_Group1_Site(
|
||||||
@ -329,6 +359,126 @@ void BaryonUtils<FImpl>::baryon_site(const mobj &D1,
|
|||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//New version without parity projection or trace
|
||||||
|
template <class FImpl>
|
||||||
|
template <class mobj, class robj>
|
||||||
|
void BaryonUtils<FImpl>::baryon_site_matrix(const mobj &D1,
|
||||||
|
const mobj &D2,
|
||||||
|
const mobj &D3,
|
||||||
|
const Gamma GammaA_i,
|
||||||
|
const Gamma GammaB_i,
|
||||||
|
const Gamma GammaA_f,
|
||||||
|
const Gamma GammaB_f,
|
||||||
|
const bool * wick_contraction,
|
||||||
|
robj &result)
|
||||||
|
{
|
||||||
|
|
||||||
|
auto D1_GAi = D1 * GammaA_i;
|
||||||
|
auto GAf_D1_GAi = GammaA_f * D1_GAi;
|
||||||
|
auto GBf_D1_GAi = GammaB_f * D1_GAi;
|
||||||
|
|
||||||
|
auto D2_GBi = D2 * GammaB_i;
|
||||||
|
auto GBf_D2_GBi = GammaB_f * D2_GBi;
|
||||||
|
auto GAf_D2_GBi = GammaA_f * D2_GBi;
|
||||||
|
|
||||||
|
auto GBf_D3 = GammaB_f * D3;
|
||||||
|
auto GAf_D3 = GammaA_f * D3;
|
||||||
|
|
||||||
|
for (int ie_f=0; ie_f < 6 ; ie_f++){
|
||||||
|
int a_f = epsilon[ie_f][0]; //a
|
||||||
|
int b_f = epsilon[ie_f][1]; //b
|
||||||
|
int c_f = epsilon[ie_f][2]; //c
|
||||||
|
for (int ie_i=0; ie_i < 6 ; ie_i++){
|
||||||
|
int a_i = epsilon[ie_i][0]; //a'
|
||||||
|
int b_i = epsilon[ie_i][1]; //b'
|
||||||
|
int c_i = epsilon[ie_i][2]; //c'
|
||||||
|
|
||||||
|
Real ee = epsilon_sgn[ie_f] * epsilon_sgn[ie_i];
|
||||||
|
//This is the \delta_{456}^{123} part
|
||||||
|
if (wick_contraction[0]){
|
||||||
|
for (int rho_i=0; rho_i<Ns; rho_i++){
|
||||||
|
for (int rho_f=0; rho_f<Ns; rho_f++){
|
||||||
|
auto GAf_D1_GAi_rr_cc = GAf_D1_GAi()(rho_f,rho_i)(c_f,c_i);
|
||||||
|
for (int alpha_f=0; alpha_f<Ns; alpha_f++){
|
||||||
|
for (int beta_i=0; beta_i<Ns; beta_i++){
|
||||||
|
result()(rho_f,rho_i)() += ee * GAf_D1_GAi_rr_cc
|
||||||
|
* D2_GBi ()(alpha_f,beta_i)(a_f,a_i)
|
||||||
|
* GBf_D3 ()(alpha_f,beta_i)(b_f,b_i);
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
//This is the \delta_{456}^{231} part
|
||||||
|
if (wick_contraction[1]){
|
||||||
|
for (int rho_i=0; rho_i<Ns; rho_i++){
|
||||||
|
for (int alpha_f=0; alpha_f<Ns; alpha_f++){
|
||||||
|
auto D1_GAi_ar_ac = D1_GAi()(alpha_f,rho_i)(a_f,c_i);
|
||||||
|
for (int beta_i=0; beta_i<Ns; beta_i++){
|
||||||
|
auto GBf_D2_GBi_ab_ba = GBf_D2_GBi ()(alpha_f,beta_i)(b_f,a_i);
|
||||||
|
for (int rho_f=0; rho_f<Ns; rho_f++){
|
||||||
|
result()(rho_f,rho_i)() += ee * D1_GAi_ar_ac
|
||||||
|
* GBf_D2_GBi_ab_ba
|
||||||
|
* GAf_D3 ()(rho_f,beta_i)(c_f,b_i);
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
//This is the \delta_{456}^{312} part
|
||||||
|
if (wick_contraction[2]){
|
||||||
|
for (int rho_i=0; rho_i<Ns; rho_i++){
|
||||||
|
for (int alpha_f=0; alpha_f<Ns; alpha_f++){
|
||||||
|
auto GBf_D1_GAi_ar_bc = GBf_D1_GAi()(alpha_f,rho_i)(b_f,c_i);
|
||||||
|
for (int beta_i=0; beta_i<Ns; beta_i++){
|
||||||
|
auto D3_ab_ab = D3 ()(alpha_f,beta_i)(a_f,b_i);
|
||||||
|
for (int rho_f=0; rho_f<Ns; rho_f++){
|
||||||
|
result()(rho_f,rho_i)() += ee * GBf_D1_GAi_ar_bc
|
||||||
|
* GAf_D2_GBi ()(rho_f,beta_i)(c_f,a_i)
|
||||||
|
* D3_ab_ab;
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
//This is the \delta_{456}^{132} part
|
||||||
|
if (wick_contraction[3]){
|
||||||
|
for (int rho_i=0; rho_i<Ns; rho_i++){
|
||||||
|
for (int rho_f=0; rho_f<Ns; rho_f++){
|
||||||
|
auto GAf_D1_GAi_rr_cc = GAf_D1_GAi()(rho_f,rho_i)(c_f,c_i);
|
||||||
|
for (int alpha_f=0; alpha_f<Ns; alpha_f++){
|
||||||
|
for (int beta_i=0; beta_i<Ns; beta_i++){
|
||||||
|
result()(rho_f,rho_i)() -= ee * GAf_D1_GAi_rr_cc
|
||||||
|
* GBf_D2_GBi ()(alpha_f,beta_i)(b_f,a_i)
|
||||||
|
* D3 ()(alpha_f,beta_i)(a_f,b_i);
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
//This is the \delta_{456}^{321} part
|
||||||
|
if (wick_contraction[4]){
|
||||||
|
for (int rho_i=0; rho_i<Ns; rho_i++){
|
||||||
|
for (int alpha_f=0; alpha_f<Ns; alpha_f++){
|
||||||
|
auto GBf_D1_GAi_ar_bc = GBf_D1_GAi()(alpha_f,rho_i)(b_f,c_i);
|
||||||
|
for (int beta_i=0; beta_i<Ns; beta_i++){
|
||||||
|
auto D2_GBi_ab_aa = D2_GBi()(alpha_f,beta_i)(a_f,a_i);
|
||||||
|
for (int rho_f=0; rho_f<Ns; rho_f++){
|
||||||
|
result()(rho_f,rho_i)() -= ee * GBf_D1_GAi_ar_bc
|
||||||
|
* D2_GBi_ab_aa
|
||||||
|
* GAf_D3 ()(rho_f,beta_i)(c_f,b_i);
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
//This is the \delta_{456}^{213} part
|
||||||
|
if (wick_contraction[5]){
|
||||||
|
for (int rho_i=0; rho_i<Ns; rho_i++){
|
||||||
|
for (int alpha_f=0; alpha_f<Ns; alpha_f++){
|
||||||
|
auto D1_GAi_ar_ac = D1_GAi()(alpha_f,rho_i)(a_f,c_i);
|
||||||
|
for (int beta_i=0; beta_i<Ns; beta_i++){
|
||||||
|
auto GBf_D3_ab_bb = GBf_D3()(alpha_f,beta_i)(b_f,b_i);
|
||||||
|
for (int rho_f=0; rho_f<Ns; rho_f++){
|
||||||
|
result()(rho_f,rho_i)() -= ee * D1_GAi_ar_ac
|
||||||
|
* GAf_D2_GBi ()(rho_f,beta_i)(c_f,a_i)
|
||||||
|
* GBf_D3_ab_bb;
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
/* Computes which wick contractions should be performed for a *
|
/* Computes which wick contractions should be performed for a *
|
||||||
* baryon 2pt function given the initial and finals state quark *
|
* baryon 2pt function given the initial and finals state quark *
|
||||||
* flavours. *
|
* flavours. *
|
||||||
@ -404,6 +554,60 @@ void BaryonUtils<FImpl>::ContractBaryons(const PropagatorField &q1_left,
|
|||||||
t += usecond();
|
t += usecond();
|
||||||
|
|
||||||
std::cout << std::setw(10) << bytes/t*1.0e6/1024/1024/1024 << " GB/s " << std::endl;
|
std::cout << std::setw(10) << bytes/t*1.0e6/1024/1024/1024 << " GB/s " << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class FImpl>
|
||||||
|
void BaryonUtils<FImpl>::ContractBaryons_matrix(const PropagatorField &q1_left,
|
||||||
|
const PropagatorField &q2_left,
|
||||||
|
const PropagatorField &q3_left,
|
||||||
|
const Gamma GammaA_left,
|
||||||
|
const Gamma GammaB_left,
|
||||||
|
const Gamma GammaA_right,
|
||||||
|
const Gamma GammaB_right,
|
||||||
|
const bool* wick_contractions,
|
||||||
|
SpinMatrixField &baryon_corr)
|
||||||
|
{
|
||||||
|
|
||||||
|
assert(Ns==4 && "Baryon code only implemented for N_spin = 4");
|
||||||
|
assert(Nc==3 && "Baryon code only implemented for N_colour = 3");
|
||||||
|
|
||||||
|
std::cout << "GammaA (left) " << (GammaA_left.g) << std::endl;
|
||||||
|
std::cout << "GammaB (left) " << (GammaB_left.g) << std::endl;
|
||||||
|
std::cout << "GammaA (right) " << (GammaA_right.g) << std::endl;
|
||||||
|
std::cout << "GammaB (right) " << (GammaB_right.g) << std::endl;
|
||||||
|
|
||||||
|
GridBase *grid = q1_left.Grid();
|
||||||
|
|
||||||
|
autoView(vbaryon_corr, baryon_corr,CpuWrite);
|
||||||
|
autoView( v1 , q1_left, CpuRead);
|
||||||
|
autoView( v2 , q2_left, CpuRead);
|
||||||
|
autoView( v3 , q3_left, CpuRead);
|
||||||
|
|
||||||
|
// Real bytes =0.;
|
||||||
|
// bytes += grid->oSites() * (432.*sizeof(vComplex) + 126.*sizeof(int) + 36.*sizeof(Real));
|
||||||
|
// for (int ie=0; ie < 6 ; ie++){
|
||||||
|
// if(ie==0 or ie==3){
|
||||||
|
// bytes += grid->oSites() * (4.*sizeof(int) + 4752.*sizeof(vComplex)) * wick_contractions[ie];
|
||||||
|
// }
|
||||||
|
// else{
|
||||||
|
// bytes += grid->oSites() * (64.*sizeof(int) + 5184.*sizeof(vComplex)) * wick_contractions[ie];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// Real t=0.;
|
||||||
|
// t =-usecond();
|
||||||
|
|
||||||
|
accelerator_for(ss, grid->oSites(), grid->Nsimd(), {
|
||||||
|
auto D1 = v1[ss];
|
||||||
|
auto D2 = v2[ss];
|
||||||
|
auto D3 = v3[ss];
|
||||||
|
sobj result=Zero();
|
||||||
|
baryon_site_matrix(D1,D2,D3,GammaA_left,GammaB_left,GammaA_right,GammaB_right,wick_contractions,result);
|
||||||
|
vbaryon_corr[ss] = result;
|
||||||
|
} );//end loop over lattice sites
|
||||||
|
|
||||||
|
// t += usecond();
|
||||||
|
|
||||||
|
// std::cout << std::setw(10) << bytes/t*1.0e6/1024/1024/1024 << " GB/s " << std::endl;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -442,6 +646,33 @@ void BaryonUtils<FImpl>::ContractBaryons_Sliced(const mobj &D1,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class FImpl>
|
||||||
|
template <class mobj, class robj>
|
||||||
|
void BaryonUtils<FImpl>::ContractBaryons_Sliced_matrix(const mobj &D1,
|
||||||
|
const mobj &D2,
|
||||||
|
const mobj &D3,
|
||||||
|
const Gamma GammaA_left,
|
||||||
|
const Gamma GammaB_left,
|
||||||
|
const Gamma GammaA_right,
|
||||||
|
const Gamma GammaB_right,
|
||||||
|
const bool* wick_contractions,
|
||||||
|
const int nt,
|
||||||
|
robj &result)
|
||||||
|
{
|
||||||
|
|
||||||
|
assert(Ns==4 && "Baryon code only implemented for N_spin = 4");
|
||||||
|
assert(Nc==3 && "Baryon code only implemented for N_colour = 3");
|
||||||
|
|
||||||
|
std::cout << "GammaA (left) " << (GammaA_left.g) << std::endl;
|
||||||
|
std::cout << "GammaB (left) " << (GammaB_left.g) << std::endl;
|
||||||
|
std::cout << "GammaA (right) " << (GammaA_right.g) << std::endl;
|
||||||
|
std::cout << "GammaB (right) " << (GammaB_right.g) << std::endl;
|
||||||
|
|
||||||
|
for (int t=0; t<nt; t++) {
|
||||||
|
baryon_site_matrix(D1[t],D2[t],D3[t],GammaA_left,GammaB_left,GammaA_right,GammaB_right,wick_contractions,result[t]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* End of Baryon 2pt-function code. *
|
* End of Baryon 2pt-function code. *
|
||||||
* *
|
* *
|
||||||
|
Loading…
Reference in New Issue
Block a user