16 extern void *
memset(
void *
s,
int c,
size_t n);
29 template<
typename Float>
34 for (i = 0;i < 3; i++){
36 printf(
"(%10f,%10f) \t", link[i*3*2 + j*2], link[i*3*2 + j*2 + 1]);
45 template <
typename sFloat,
typename gFloat>
47 int oddBit,
int daggerBit,
int mu)
51 gFloat *linkEven[4], *linkOdd[4];
53 for (
int dir = 0; dir < 4; dir++) {
54 linkEven[dir] = link[dir];
58 for (
int sid = 0; sid <
Vh; sid++) {
59 int offset = mySpinorSiteSize*sid;
63 gFloat *lnk =
gaugeLink(sid, mu, oddBit, linkEven, linkOdd, 1);
67 for (
int s = 0;
s < 4;
s++)
68 su3Tmul(&gaugedSpinor[
s*6], lnk, &spinor[s*6]);
70 for (
int s = 0;
s < 4;
s++)
71 su3Mul (&gaugedSpinor[
s*6], lnk, &spinor[s*6]);
74 sum(&res[offset], &res[offset], gaugedSpinor, mySpinorSiteSize);
78 void covdev_dslash(
void *res,
void **link,
void *spinorField,
int oddBit,
int daggerBit,
int mu,
84 covdevReference((
double*)res, (
double**)link, (
double*)spinorField, oddBit, daggerBit, mu);
86 covdevReference((
double*)res, (
float**) link, (
double*)spinorField, oddBit, daggerBit, mu);
91 covdevReference((
float*)res, (
double**)link, (
float*)spinorField, oddBit, daggerBit, mu);
93 covdevReference((
float*)res, (
float**) link, (
float*)spinorField, oddBit, daggerBit, mu);
98 template <
typename sFloat,
typename gFloat>
99 void Mat(sFloat *
out, gFloat **link, sFloat *
in,
int daggerBit,
int mu)
103 sFloat *outEven =
out;
112 void mat(
void *
out,
void **link,
void *
in,
int dagger_bit,
int mu,
118 Mat((
double*)out, (
double**)link, (
double*)in, dagger_bit, mu);
120 Mat((
double*)out, (
float**) link, (
double*)in, dagger_bit, mu);
124 Mat((
float*)out, (
double**)link, (
float*)in, dagger_bit, mu);
126 Mat((
float*)out, (
float**) link, (
float*)in, dagger_bit, mu);
133 template <
typename sFloat,
typename gFloat>
140 sFloat *outEven =
out;
148 sFloat *outOdd =
out;
155 fprintf(stderr,
"ERROR: invalid parity in %s,line %d\n", __FUNCTION__, __LINE__);
168 Matdagmat((
double*)out, (
double**)link, (
double*)in, dagger_bit, mu, (
double*)tmp, parity);
170 Matdagmat((
double*)out, (
float**) link, (
double*)in, dagger_bit, mu, (
double*)tmp, parity);
174 Matdagmat((
float*)out, (
double**)link, (
float*)in, dagger_bit, mu, (
float*)tmp, parity);
176 Matdagmat((
float*)out, (
float**) link, (
float*)in, dagger_bit, mu, (
float*)tmp, parity);
183 template <
typename sFloat,
typename gFloat>
184 void covdevReference_mg4dir(sFloat *res, gFloat **link, gFloat **ghostLink, sFloat *spinorField,
185 sFloat **fwd_nbr_spinor, sFloat **back_nbr_spinor,
int oddBit,
int daggerBit,
int mu)
189 gFloat *linkEven[4], *linkOdd[4];
190 gFloat *ghostLinkEven[4], *ghostLinkOdd[4];
192 for (
int dir = 0; dir < 4; dir++) {
193 linkEven[dir] = link[dir];
196 ghostLinkEven[dir] = ghostLink[dir];
197 ghostLinkOdd[dir] = ghostLink[dir] + (
faceVolume[dir]/2)*gaugeSiteSize;
200 for (
int sid = 0; sid <
Vh; sid++) {
201 int offset = mySpinorSiteSize*sid;
203 gFloat *lnk = gaugeLink_mg4dir(sid, mu, oddBit, linkEven, linkOdd, ghostLinkEven, ghostLinkOdd, 1, 1);
204 sFloat *
spinor = spinorNeighbor_mg4dir(sid, mu, oddBit, spinorField, fwd_nbr_spinor, back_nbr_spinor, 1, 1);
209 for (
int s = 0;
s < 4;
s++)
210 su3Tmul(&gaugedSpinor[
s*6], lnk, &spinor[s*6]);
212 for (
int s = 0;
s < 4;
s++)
213 su3Mul (&gaugedSpinor[
s*6], lnk, &spinor[s*6]);
215 sum(&res[offset], &res[offset], gaugedSpinor, mySpinorSiteSize);
229 errorQuda(
"ERROR: full parity not supported in function %s", __FUNCTION__);
240 covdevReference_mg4dir((
double*)out->
V(), (
double**)link, (
double**)ghostLink, (
double*)in->
V(),
241 (
double**)fwd_nbr_spinor, (
double**)back_nbr_spinor, oddBit, daggerBit,
mu);
243 covdevReference_mg4dir((
double*)out->
V(), (
float**) link, (
float**) ghostLink, (
double*)in->
V(),
244 (
double**)fwd_nbr_spinor, (
double**)back_nbr_spinor, oddBit, daggerBit,
mu);
248 covdevReference_mg4dir((
float*)out->
V(), (
double**)link, (
double**)ghostLink, (
float*)in->
V(),
249 (
float**)fwd_nbr_spinor, (
float**)back_nbr_spinor, oddBit, daggerBit,
mu);
251 covdevReference_mg4dir((
float*)out->
V(), (
float**)link, (
float**)ghostLink, (
float*)in->
V(),
252 (
float**)fwd_nbr_spinor, (
float**)back_nbr_spinor, oddBit, daggerBit,
mu);
258 template <
typename sFloat,
typename gFloat>
268 covdevReference_mg4dir(reinterpret_cast<sFloat*>(outOdd.
V()), link, ghostLink,
269 reinterpret_cast<sFloat*>(inEven.
V()),
281 covdevReference_mg4dir(reinterpret_cast<sFloat*>(outEven.
V()), link, ghostLink,
282 reinterpret_cast<sFloat*>(inOdd.
V()),
296 Mat_mg4dir<double, double>(
out, (
double**)link, (
double**) ghostLink,
in, dagger_bit,
mu);
298 Mat_mg4dir<double, float> (
out, (
float**) link, (
float**) ghostLink,
in, dagger_bit,
mu);
302 Mat_mg4dir<float, double> (
out, (
double**)link, (
double**) ghostLink,
in, dagger_bit,
mu);
304 Mat_mg4dir<float, float> (
out, (
float**) link, (
float**) ghostLink,
in, dagger_bit,
mu);
316 if (sPrecision != gPrecision){
317 errorQuda(
"Spinor precision and gPrecison is not the same");
326 errorQuda(
"ERROR: full parity not supported in function %s\n", __FUNCTION__);
static void sum(Float *dst, Float *a, Float *b, int cnt)
enum QudaPrecision_s QudaPrecision
void covdevReference(sFloat *res, gFloat **link, sFloat *spinorField, int oddBit, int daggerBit, int mu)
void covdev_dslash(void *res, void **link, void *spinorField, int oddBit, int daggerBit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision)
cudaColorSpinorField * tmp
const ColorSpinorField & Even() const
const ColorSpinorField & Odd() const
void matdagmat_mg4dir(cpuColorSpinorField *out, void **link, void **ghostLink, cpuColorSpinorField *in, int dagger_bit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision, cpuColorSpinorField *tmp, QudaParity parity)
void Mat(sFloat *out, gFloat **link, sFloat *in, int daggerBit, int mu)
void Matdagmat(sFloat *out, gFloat **link, sFloat *in, int daggerBit, int mu, sFloat *tmp, QudaParity parity)
static Float * spinorNeighbor(int i, int dir, int oddBit, Float *spinorField, int neighbor_distance)
void display_link_internal(Float *link)
void matdagmat(void *out, void **link, void *in, int dagger_bit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision, void *tmp, QudaParity parity)
static void * backGhostFaceBuffer[QUDA_MAX_DIM]
enum QudaParity_s QudaParity
void exchangeGhost(QudaParity parity, int nFace, int dagger, const MemoryLocation *pack_destination=nullptr, const MemoryLocation *halo_location=nullptr, bool gdr_send=false, bool gdr_recv=false, QudaPrecision ghost_precision=QUDA_INVALID_PRECISION) const
This is a unified ghost exchange function for doing a complete halo exchange regardless of the type o...
static void * fwdGhostFaceBuffer[QUDA_MAX_DIM]
void * memset(void *s, int c, size_t n)
static Float * gaugeLink(int i, int dir, int oddBit, Float **gaugeEven, Float **gaugeOdd, int nbr_distance)
cpuColorSpinorField * out
void covdev_dslash_mg4dir(cpuColorSpinorField *out, void **link, void **ghostLink, cpuColorSpinorField *in, int oddBit, int daggerBit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision)
Main header file for the QUDA library.
static void su3Mul(sFloat *res, gFloat *mat, sFloat *vec)
static void su3Tmul(sFloat *res, gFloat *mat, sFloat *vec)
void mat(void *out, void **link, void *in, int dagger_bit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision)
void mat_mg4dir(cpuColorSpinorField *out, void **link, void **ghostLink, cpuColorSpinorField *in, int daggerBit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision)
cpuColorSpinorField * spinor