void DiracWilson::MdagM(cudaColorSpinorField &out, const cudaColorSpinorField &in) const { checkFullSpinor(out, in); bool reset = newTmp(&tmp1, in); checkFullSpinor(*tmp1, in); M(*tmp1, in); Mdag(out, *tmp1); deleteTmp(&tmp1, reset); }
void DiracCloverPC::reconstruct(cudaColorSpinorField &x, const cudaColorSpinorField &b, const QudaSolutionType solType) const { if (solType == QUDA_MATPC_SOLUTION || solType == QUDA_MATPCDAG_MATPC_SOLUTION) { return; } checkFullSpinor(x, b); bool reset = newTmp(&tmp1, b.Even()); // create full solution if (matpcType == QUDA_MATPC_EVEN_EVEN || matpcType == QUDA_MATPC_EVEN_EVEN_ASYMMETRIC) { // x_o = A_oo^-1 (b_o + k D_oe x_e) DiracWilson::DslashXpay(*tmp1, x.Even(), QUDA_ODD_PARITY, b.Odd(), kappa); CloverInv(x.Odd(), *tmp1, QUDA_ODD_PARITY); } else if (matpcType == QUDA_MATPC_ODD_ODD || matpcType == QUDA_MATPC_ODD_ODD_ASYMMETRIC) { // x_e = A_ee^-1 (b_e + k D_eo x_o) DiracWilson::DslashXpay(*tmp1, x.Odd(), QUDA_EVEN_PARITY, b.Even(), kappa); CloverInv(x.Even(), *tmp1, QUDA_EVEN_PARITY); } else { errorQuda("MatPCType %d not valid for DiracCloverPC", matpcType); } deleteTmp(&tmp1, reset); }
void DiracDomainWall::MdagM(ColorSpinorField &out, const ColorSpinorField &in) const { checkFullSpinor(out, in); bool reset = newTmp(&tmp1, in); M(*tmp1, in); Mdag(out, *tmp1); deleteTmp(&tmp1, reset); }
// FIXME: create kernel to eliminate tmp void DiracClover::M(cudaColorSpinorField &out, const cudaColorSpinorField &in) const { checkFullSpinor(out, in); cudaColorSpinorField *tmp=0; // this hack allows for tmp2 to be full or parity field if (tmp2) { if (tmp2->SiteSubset() == QUDA_FULL_SITE_SUBSET) tmp = &(tmp2->Even()); else tmp = tmp2; } bool reset = newTmp(&tmp, in.Even()); Clover(*tmp, in.Odd(), QUDA_ODD_PARITY); DslashXpay(out.Odd(), in.Even(), QUDA_ODD_PARITY, *tmp, -kappa); Clover(*tmp, in.Even(), QUDA_EVEN_PARITY); DslashXpay(out.Even(), in.Odd(), QUDA_EVEN_PARITY, *tmp, -kappa); deleteTmp(&tmp, reset); }
void DiracDomainWallPC::reconstruct(ColorSpinorField &x, const ColorSpinorField &b, const QudaSolutionType solType) const { if (solType == QUDA_MATPC_SOLUTION || solType == QUDA_MATPCDAG_MATPC_SOLUTION) { return; } // create full solution checkFullSpinor(x, b); if (matpcType == QUDA_MATPC_EVEN_EVEN) { // x_o = b_o + k D_oe x_e DslashXpay(x.Odd(), x.Even(), QUDA_ODD_PARITY, b.Odd(), kappa5); } else if (matpcType == QUDA_MATPC_ODD_ODD) { // x_e = b_e + k D_eo x_o DslashXpay(x.Even(), x.Odd(), QUDA_EVEN_PARITY, b.Even(), kappa5); } else { errorQuda("MatPCType %d not valid for DiracDomainWallPC", matpcType); } }
void DiracDomainWall::M(ColorSpinorField &out, const ColorSpinorField &in) const { checkFullSpinor(out, in); DslashXpay(out.Odd(), in.Even(), QUDA_ODD_PARITY, in.Odd(), -kappa5); DslashXpay(out.Even(), in.Odd(), QUDA_EVEN_PARITY, in.Even(), -kappa5); }
void DiracWilson::M(cudaColorSpinorField &out, const cudaColorSpinorField &in) const { checkFullSpinor(out, in); DslashXpay(out.Odd(), in.Even(), QUDA_ODD_PARITY, in.Odd(), -kappa); DslashXpay(out.Even(), in.Odd(), QUDA_EVEN_PARITY, in.Even(), -kappa); }