// // dslashReference() // // if oddBit is zero: calculate odd parity spinor elements (using even parity spinor) // if oddBit is one: calculate even parity spinor elements // // if daggerBit is zero: perform ordinary dslash operator // if daggerBit is one: perform hermitian conjugate of dslash // void dslashReference(float *res, float **gaugeFull, float *spinorField, int oddBit, int daggerBit) { zero(res, Nh*4*3*2); float *gaugeEven[4], *gaugeOdd[4]; for (int dir = 0; dir < 4; dir++) { gaugeEven[dir] = gaugeFull[dir]; gaugeOdd[dir] = gaugeFull[dir]+Nh*gaugeSiteSize; } for (int i = 0; i < Nh; i++) { for (int dir = 0; dir < 8; dir++) { float *gauge = gaugeLink(i, dir, oddBit, gaugeEven, gaugeOdd); float *spinor = spinorNeighbor(i, dir, oddBit, spinorField); float projectedSpinor[4*3*2], gaugedSpinor[4*3*2]; int projIdx = 2*(dir/2)+(dir+daggerBit)%2; multiplySpinorByDiracProjector(projectedSpinor, projIdx, spinor); for (int s = 0; s < 4; s++) { if (dir % 2 == 0) su3_mul(&gaugedSpinor[s*(3*2)], gauge, &projectedSpinor[s*(3*2)]); else su3_Tmul(&gaugedSpinor[s*(3*2)], gauge, &projectedSpinor[s*(3*2)]); } sum(&res[i*(4*3*2)], &res[i*(4*3*2)], gaugedSpinor, 4*3*2); } } }
void dslashReference(sFloat *res, gFloat **gaugeFull, gFloat **ghostGauge, sFloat *spinorField, sFloat **fwdSpinor, sFloat **backSpinor, int oddBit, int daggerBit) { for (int i=0; i<Vh*mySpinorSiteSize; i++) res[i] = 0.0; gFloat *gaugeEven[4], *gaugeOdd[4]; gFloat *ghostGaugeEven[4], *ghostGaugeOdd[4]; for (int dir = 0; dir < 4; dir++) { gaugeEven[dir] = gaugeFull[dir]; gaugeOdd[dir] = gaugeFull[dir]+Vh*gaugeSiteSize; ghostGaugeEven[dir] = ghostGauge[dir]; ghostGaugeOdd[dir] = ghostGauge[dir] + (faceVolume[dir]/2)*gaugeSiteSize; } for (int i = 0; i < Vh; i++) { for (int dir = 0; dir < 8; dir++) { gFloat *gauge = gaugeLink_mg4dir(i, dir, oddBit, gaugeEven, gaugeOdd, ghostGaugeEven, ghostGaugeOdd, 1, 1); sFloat *spinor = spinorNeighbor_mg4dir(i, dir, oddBit, spinorField, fwdSpinor, backSpinor, 1, 1); sFloat projectedSpinor[mySpinorSiteSize], gaugedSpinor[mySpinorSiteSize]; int projIdx = 2*(dir/2)+(dir+daggerBit)%2; multiplySpinorByDiracProjector(projectedSpinor, projIdx, spinor); for (int s = 0; s < 4; s++) { if (dir % 2 == 0) su3Mul(&gaugedSpinor[s*(3*2)], gauge, &projectedSpinor[s*(3*2)]); else su3Tmul(&gaugedSpinor[s*(3*2)], gauge, &projectedSpinor[s*(3*2)]); } sum(&res[i*(4*3*2)], &res[i*(4*3*2)], gaugedSpinor, 4*3*2); } } }