1
0
mirror of https://github.com/paboyle/Grid.git synced 2025-06-12 20:27:06 +01:00

Insertion of photon field in seqential conserved current

This commit is contained in:
Vera Guelpers
2018-02-12 09:36:08 +00:00
parent b6fe03eb26
commit 49a0ae73eb
14 changed files with 310 additions and 257 deletions

View File

@ -125,9 +125,9 @@ namespace Grid {
PropagatorField &q_out,
Current curr_type,
unsigned int mu,
std::vector<Real> mom,
unsigned int tmin,
unsigned int tmax)=0;
unsigned int tmax,
Lattice<iSinglet<Simd>> &lattice_cmplx)=0;
};
}

View File

@ -407,17 +407,19 @@ void ImprovedStaggeredFermion<Impl>::ContractConservedCurrent(PropagatorField &q
}
template <class Impl>
void ImprovedStaggeredFermion<Impl>::SeqConservedCurrent(PropagatorField &q_in,
PropagatorField &q_out,
Current curr_type,
unsigned int mu,
std::vector<Real> mom,
unsigned int tmin,
unsigned int tmax)
void ImprovedStaggeredFermion<Impl>::SeqConservedCurrent(PropagatorField &q_in,
PropagatorField &q_out,
Current curr_type,
unsigned int mu,
unsigned int tmin,
unsigned int tmax,
Lattice<iSinglet<Simd>> &lattice_cmplx)
{
assert(0);
}
FermOpStaggeredTemplateInstantiate(ImprovedStaggeredFermion);
//AdjointFermOpTemplateInstantiate(ImprovedStaggeredFermion);

View File

@ -166,13 +166,13 @@ class ImprovedStaggeredFermion : public StaggeredKernels<Impl>, public ImprovedS
PropagatorField &q_out,
Current curr_type,
unsigned int mu);
void SeqConservedCurrent(PropagatorField &q_in,
void SeqConservedCurrent(PropagatorField &q_in,
PropagatorField &q_out,
Current curr_type,
unsigned int mu,
std::vector<Real> mom,
unsigned int tmin,
unsigned int tmax);
Current curr_type,
unsigned int mu,
unsigned int tmin,
unsigned int tmax,
Lattice<iSinglet<Simd>> &lattice_cmplx);
};
typedef ImprovedStaggeredFermion<StaggeredImplF> ImprovedStaggeredFermionF;

View File

@ -419,15 +419,16 @@ void ImprovedStaggeredFermion5D<Impl>::ContractConservedCurrent(PropagatorField
}
template <class Impl>
void ImprovedStaggeredFermion5D<Impl>::SeqConservedCurrent(PropagatorField &q_in,
PropagatorField &q_out,
Current curr_type,
unsigned int mu,
std::vector<Real> mom,
unsigned int tmin,
unsigned int tmax)
void ImprovedStaggeredFermion5D<Impl>::SeqConservedCurrent(PropagatorField &q_in,
PropagatorField &q_out,
Current curr_type,
unsigned int mu,
unsigned int tmin,
unsigned int tmax,
Lattice<iSinglet<Simd>> &lattice_cmplx)
{
assert(0);
}
FermOpStaggeredTemplateInstantiate(ImprovedStaggeredFermion5D);

View File

@ -178,13 +178,13 @@ namespace QCD {
PropagatorField &q_out,
Current curr_type,
unsigned int mu);
void SeqConservedCurrent(PropagatorField &q_in,
void SeqConservedCurrent(PropagatorField &q_in,
PropagatorField &q_out,
Current curr_type,
unsigned int mu,
std::vector<Real> mom,
unsigned int tmin,
unsigned int tmax);
Current curr_type,
unsigned int mu,
unsigned int tmin,
unsigned int tmax,
Lattice<iSinglet<Simd>> &lattice_cmplx);
};
}}

View File

@ -381,40 +381,100 @@ void WilsonFermion<Impl>::ContractConservedCurrent(PropagatorField &q_in_1,
}
}
//template <class Impl>
//void WilsonFermion<Impl>::SeqConservedCurrent(PropagatorField &q_in,
// PropagatorField &q_out,
// Current curr_type,
// unsigned int mu,
// std::vector<Real> mom,
// unsigned int tmin,
// unsigned int tmax)
//{
// conformable(_grid, q_in._grid);
// conformable(_grid, q_out._grid);
// Lattice<iSinglet<Simd>> ph(_grid), coor(_grid);
// Complex i(0.0,1.0);
// PropagatorField tmpFwd(_grid), tmpBwd(_grid), tmp(_grid);
// unsigned int tshift = (mu == Tp) ? 1 : 0;
// unsigned int LLt = GridDefaultLatt()[Tp];
//
// // Momentum projection
// ph = zero;
// for(unsigned int mu = 0; mu < Nd - 1; mu++)
// {
// LatticeCoordinate(coor, mu);
// ph = ph + mom[mu]*coor*((1./(_grid->_fdimensions[mu])));
// }
// ph = exp((Real)(2*M_PI)*i*ph);
//
// q_out = zero;
// LatticeInteger coords(_grid);
// LatticeCoordinate(coords, Tp);
//
// // Need q(x + mu) and q(x - mu).
// tmp = Cshift(q_in, mu, 1);
// tmpFwd = tmp*ph;
// tmp = ph*q_in;
// tmpBwd = Cshift(tmp, mu, -1);
//
// parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU)
// {
// // Compute the sequential conserved current insertion only if our simd
// // object contains a timeslice we need.
// vInteger t_mask = ((coords._odata[sU] >= tmin) &&
// (coords._odata[sU] <= tmax));
// Integer timeSlices = Reduce(t_mask);
//
// if (timeSlices > 0)
// {
// Kernels::SeqConservedCurrentSiteFwd(tmpFwd._odata[sU],
// q_out._odata[sU],
// Umu, sU, mu, t_mask);
// }
//
// // Repeat for backward direction.
// t_mask = ((coords._odata[sU] >= (tmin + tshift)) &&
// (coords._odata[sU] <= (tmax + tshift)));
//
// //if tmax = LLt-1 (last timeslice) include timeslice 0 if the time is shifted (mu=3)
// unsigned int t0 = 0;
// if((tmax==LLt-1) && (tshift==1)) t_mask = (t_mask || (coords._odata[sU] == t0 ));
//
// timeSlices = Reduce(t_mask);
//
// if (timeSlices > 0)
// {
// Kernels::SeqConservedCurrentSiteBwd(tmpBwd._odata[sU],
// q_out._odata[sU],
// Umu, sU, mu, t_mask);
// }
// }
//}
template <class Impl>
void WilsonFermion<Impl>::SeqConservedCurrent(PropagatorField &q_in,
PropagatorField &q_out,
Current curr_type,
unsigned int mu,
std::vector<Real> mom,
unsigned int tmin,
unsigned int tmax)
unsigned int tmax,
Lattice<iSinglet<Simd>> &lattice_cmplx)
{
conformable(_grid, q_in._grid);
conformable(_grid, q_out._grid);
Lattice<iSinglet<Simd>> ph(_grid), coor(_grid);
Complex i(0.0,1.0);
PropagatorField tmpFwd(_grid), tmpBwd(_grid), tmp(_grid);
unsigned int tshift = (mu == Tp) ? 1 : 0;
unsigned int LLt = GridDefaultLatt()[Tp];
// Momentum projection
ph = zero;
for(unsigned int mu = 0; mu < Nd - 1; mu++)
{
LatticeCoordinate(coor, mu);
ph = ph + mom[mu]*coor*((1./(_grid->_fdimensions[mu])));
}
ph = exp((Real)(2*M_PI)*i*ph);
q_out = zero;
LatticeInteger coords(_grid);
LatticeCoordinate(coords, Tp);
// Need q(x + mu) and q(x - mu).
tmp = Cshift(q_in, mu, 1);
tmpFwd = tmp*ph;
tmp = ph*q_in;
tmpFwd = tmp*lattice_cmplx;
tmp = lattice_cmplx*q_in;
tmpBwd = Cshift(tmp, mu, -1);
parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU)
@ -449,6 +509,8 @@ void WilsonFermion<Impl>::SeqConservedCurrent(PropagatorField &q_in,
Umu, sU, mu, t_mask);
}
}
}
FermOpTemplateInstantiate(WilsonFermion);

View File

@ -155,13 +155,13 @@ class WilsonFermion : public WilsonKernels<Impl>, public WilsonFermionStatic {
PropagatorField &q_out,
Current curr_type,
unsigned int mu);
void SeqConservedCurrent(PropagatorField &q_in,
PropagatorField &q_out,
Current curr_type,
unsigned int mu,
std::vector<Real> mom,
unsigned int tmin,
unsigned int tmax);
void SeqConservedCurrent(PropagatorField &q_in,
PropagatorField &q_out,
Current curr_type,
unsigned int mu,
unsigned int tmin,
unsigned int tmax,
Lattice<iSinglet<Simd>> &lattice_cmplx);
};
typedef WilsonFermion<WilsonImplF> WilsonFermionF;

View File

@ -779,18 +779,110 @@ void WilsonFermion5D<Impl>::ContractConservedCurrent(PropagatorField &q_in_1,
}
//template <class Impl>
//void WilsonFermion5D<Impl>::SeqConservedCurrent(PropagatorField &q_in,
// PropagatorField &q_out,
// Current curr_type,
// unsigned int mu,
// std::vector<Real> mom,
// unsigned int tmin,
// unsigned int tmax)
//{
// conformable(q_in._grid, FermionGrid());
// conformable(q_in._grid, q_out._grid);
// Lattice<iSinglet<Simd>> ph(FermionGrid()), coor(FermionGrid());
// PropagatorField tmpFwd(FermionGrid()), tmpBwd(FermionGrid()),
// tmp(FermionGrid());
// Complex i(0.0, 1.0);
// unsigned int tshift = (mu == Tp) ? 1 : 0;
// unsigned int LLs = q_in._grid->_rdimensions[0];
// unsigned int LLt = GridDefaultLatt()[Tp];
//
// // Momentum projection.
// ph = zero;
// for(unsigned int nu = 0; nu < Nd - 1; nu++)
// {
// // Shift coordinate lattice index by 1 to account for 5th dimension.
// LatticeCoordinate(coor, nu + 1);
// ph = ph + mom[nu]*coor*((1./(_FourDimGrid->_fdimensions[nu])));
// }
// ph = exp((Real)(2*M_PI)*i*ph);
//
// q_out = zero;
// LatticeInteger coords(_FourDimGrid);
// LatticeCoordinate(coords, Tp);
//
//
// // Need q(x + mu, s) and q(x - mu, s). 5D lattice so shift 4D coordinate mu
// // by one.
// tmp = Cshift(q_in, mu + 1, 1);
// tmpFwd = tmp*ph;
// tmp = ph*q_in;
// tmpBwd = Cshift(tmp, mu + 1, -1);
//
// parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU)
// {
// // Compute the sequential conserved current insertion only if our simd
// // object contains a timeslice we need.
// vInteger t_mask = ((coords._odata[sU] >= tmin) &&
// (coords._odata[sU] <= tmax));
// Integer timeSlices = Reduce(t_mask);
//
// if (timeSlices > 0)
// {
// unsigned int sF = sU * LLs;
// for (unsigned int s = 0; s < LLs; ++s)
// {
// bool axial_sign = ((curr_type == Current::Axial) && (s < (LLs / 2)));
// bool tadpole_sign = (curr_type == Current::Tadpole);
// bool switch_sgn = tadpole_sign || axial_sign;
//
// Kernels::SeqConservedCurrentSiteFwd(tmpFwd._odata[sF],
// q_out._odata[sF], Umu, sU,
// mu, t_mask, switch_sgn);
// ++sF;
// }
// }
//
// // Repeat for backward direction.
// t_mask = ((coords._odata[sU] >= (tmin + tshift)) &&
// (coords._odata[sU] <= (tmax + tshift)));
//
// //if tmax = LLt-1 (last timeslice) include timeslice 0 if the time is shifted (mu=3)
// unsigned int t0 = 0;
// if((tmax==LLt-1) && (tshift==1)) t_mask = (t_mask || (coords._odata[sU] == t0 ));
//
// timeSlices = Reduce(t_mask);
//
// if (timeSlices > 0)
// {
// unsigned int sF = sU * LLs;
// for (unsigned int s = 0; s < LLs; ++s)
// {
// bool axial_sign = ((curr_type == Current::Axial) && (s < (LLs / 2)));
// Kernels::SeqConservedCurrentSiteBwd(tmpBwd._odata[sF],
// q_out._odata[sF], Umu, sU,
// mu, t_mask, axial_sign);
// ++sF;
// }
// }
// }
//}
template <class Impl>
void WilsonFermion5D<Impl>::SeqConservedCurrent(PropagatorField &q_in,
PropagatorField &q_out,
Current curr_type,
unsigned int mu,
std::vector<Real> mom,
unsigned int tmin,
unsigned int tmax)
unsigned int tmax,
Lattice<iSinglet<Simd>> &lattice_cmplx)
{
conformable(q_in._grid, FermionGrid());
conformable(q_in._grid, q_out._grid);
Lattice<iSinglet<Simd>> ph(FermionGrid()), coor(FermionGrid());
PropagatorField tmpFwd(FermionGrid()), tmpBwd(FermionGrid()),
tmp(FermionGrid());
Complex i(0.0, 1.0);
@ -798,25 +890,26 @@ void WilsonFermion5D<Impl>::SeqConservedCurrent(PropagatorField &q_in,
unsigned int LLs = q_in._grid->_rdimensions[0];
unsigned int LLt = GridDefaultLatt()[Tp];
// Momentum projection.
ph = zero;
for(unsigned int nu = 0; nu < Nd - 1; nu++)
{
// Shift coordinate lattice index by 1 to account for 5th dimension.
LatticeCoordinate(coor, nu + 1);
ph = ph + mom[nu]*coor*((1./(_FourDimGrid->_fdimensions[nu])));
}
ph = exp((Real)(2*M_PI)*i*ph);
q_out = zero;
LatticeInteger coords(_FourDimGrid);
LatticeCoordinate(coords, Tp);
//QED: photon field is 4dim, but need a 5dim object to multiply to
// DWF PropagatorField
Lattice<iSinglet<Simd>> lattice_cmplx_5d(FermionGrid());
for (unsigned int s = 0; s < LLs; ++s)
{
InsertSlice(lattice_cmplx,lattice_cmplx_5d, s, 0);
}
// Need q(x + mu, s) and q(x - mu, s). 5D lattice so shift 4D coordinate mu
// by one.
tmp = Cshift(q_in, mu + 1, 1);
tmpFwd = tmp*ph;
tmp = ph*q_in;
tmpFwd = tmp*lattice_cmplx_5d;
tmp = lattice_cmplx_5d*q_in;
tmpBwd = Cshift(tmp, mu + 1, -1);
parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU)
@ -868,6 +961,10 @@ void WilsonFermion5D<Impl>::SeqConservedCurrent(PropagatorField &q_in,
}
}
FermOpTemplateInstantiate(WilsonFermion5D);
GparityFermOpTemplateInstantiate(WilsonFermion5D);

View File

@ -222,13 +222,13 @@ namespace QCD {
PropagatorField &q_out,
Current curr_type,
unsigned int mu);
void SeqConservedCurrent(PropagatorField &q_in,
void SeqConservedCurrent(PropagatorField &q_in,
PropagatorField &q_out,
Current curr_type,
Current curr_type,
unsigned int mu,
std::vector<Real> mom,
unsigned int tmin,
unsigned int tmax);
unsigned int tmin,
unsigned int tmax,
Lattice<iSinglet<Simd>> &lattice_cmplx);
};
}}