//!NEW : added setFace(), domainWallDslashCuda() got an extra argument void DiracDomainWall::Dslash(cudaColorSpinorField &out, const cudaColorSpinorField &in, const QudaParity parity) const { if ( in.Ndim() != 5 || out.Ndim() != 5) errorQuda("Wrong number of dimensions\n"); checkParitySpinor(in, out); checkSpinorAlias(in, out); domainwall::setFace(face1,face2); // FIXME: temporary hack maintain C linkage for dslashCuda domainWallDslashCuda(&out, gauge, &in, parity, dagger, 0, mass, 0, commDim, profile); long long Ls = in.X(4); long long bulk = (Ls-2)*(in.Volume()/Ls); long long wall = 2*in.Volume()/Ls; flops += 1320LL*(long long)in.Volume() + 96LL*bulk + 120LL*wall; }
void DiracDomainWall::Dslash(cudaColorSpinorField &out, const cudaColorSpinorField &in, const QudaParity parity) const { if ( in.Ndim() != 5 || out.Ndim() != 5) errorQuda("Wrong number of dimensions\n"); if (!initDslash) initDslashConstants(gauge, in.Stride()); if (!initDomainWall) initDomainWallConstants(in.X(4)); checkParitySpinor(in, out); checkSpinorAlias(in, out); domainWallDslashCuda(&out, gauge, &in, parity, dagger, 0, mass, 0, tuneDslash); long long Ls = in.X(4); long long bulk = (Ls-2)*(in.Volume()/Ls); long long wall = 2*in.Volume()/Ls; flops += 1320LL*(long long)in.Volume() + 96LL*bulk + 120LL*wall; }
//!NEW : added setFace(), domainWallDslashCuda() got an extra argument void DiracDomainWall::DslashXpay(cudaColorSpinorField &out, const cudaColorSpinorField &in, const QudaParity parity, const cudaColorSpinorField &x, const double &k) const { if ( in.Ndim() != 5 || out.Ndim() != 5) errorQuda("Wrong number of dimensions\n"); checkParitySpinor(in, out); checkSpinorAlias(in, out); initSpinorConstants(in); setFace(face); // FIXME: temporary hack maintain C linkage for dslashCuda domainWallDslashCuda(&out, gauge, &in, parity, dagger, &x, mass, k, commDim); long long Ls = in.X(4); long long bulk = (Ls-2)*(in.Volume()/Ls); long long wall = 2*in.Volume()/Ls; flops += (1320LL+48LL)*(long long)in.Volume() + 96LL*bulk + 120LL*wall; }
// Apply the even-odd preconditioned clover-improved Dirac operator void DiracDomainWallPC::M(cudaColorSpinorField &out, const cudaColorSpinorField &in) const { if ( in.Ndim() != 5 || out.Ndim() != 5) errorQuda("Wrong number of dimensions\n"); double kappa2 = -kappa5*kappa5; bool reset = newTmp(&tmp1, in); if (matpcType == QUDA_MATPC_EVEN_EVEN) { Dslash(*tmp1, in, QUDA_ODD_PARITY); DslashXpay(out, *tmp1, QUDA_EVEN_PARITY, in, kappa2); } else if (matpcType == QUDA_MATPC_ODD_ODD) { Dslash(*tmp1, in, QUDA_EVEN_PARITY); DslashXpay(out, *tmp1, QUDA_ODD_PARITY, in, kappa2); } else { errorQuda("MatPCType %d not valid for DiracDomainWallPC", matpcType); } deleteTmp(&tmp1, reset); }
void Dirac::checkParitySpinor(const cudaColorSpinorField &out, const cudaColorSpinorField &in) const { if (in.GammaBasis() != QUDA_UKQCD_GAMMA_BASIS || out.GammaBasis() != QUDA_UKQCD_GAMMA_BASIS) { errorQuda("CUDA Dirac operator requires UKQCD basis, out = %d, in = %d", out.GammaBasis(), in.GammaBasis()); } if (in.Precision() != out.Precision()) { errorQuda("Input precision %d and output spinor precision %d don't match in dslash_quda", in.Precision(), out.Precision()); } if (in.Stride() != out.Stride()) { errorQuda("Input %d and output %d spinor strides don't match in dslash_quda", in.Stride(), out.Stride()); } if (in.SiteSubset() != QUDA_PARITY_SITE_SUBSET || out.SiteSubset() != QUDA_PARITY_SITE_SUBSET) { errorQuda("ColorSpinorFields are not single parity: in = %d, out = %d", in.SiteSubset(), out.SiteSubset()); } if (out.Ndim() != 5) { if ((out.Volume() != gauge.Volume() && out.SiteSubset() == QUDA_FULL_SITE_SUBSET) || (out.Volume() != gauge.VolumeCB() && out.SiteSubset() == QUDA_PARITY_SITE_SUBSET) ) { errorQuda("Spinor volume %d doesn't match gauge volume %d", out.Volume(), gauge.VolumeCB()); } } else { // Domain wall fermions, compare 4d volumes not 5d if ((out.Volume()/out.X(4) != gauge.Volume() && out.SiteSubset() == QUDA_FULL_SITE_SUBSET) || (out.Volume()/out.X(4) != gauge.VolumeCB() && out.SiteSubset() == QUDA_PARITY_SITE_SUBSET) ) { errorQuda("Spinor volume %d doesn't match gauge volume %d", out.Volume(), gauge.VolumeCB()); } } }