13 for (
int i = 0; i <
Ls; i++) {
14 if (
b_5[i].imag() != 0.0 ||
c_5[i].imag() != 0.0 || (i < Ls - 1 && (
b_5[i] !=
b_5[i + 1] ||
c_5[i] !=
c_5[i + 1]))) {
21 printfQuda(
"%s: Detected variable or complex cofficients: using zMobius\n", __func__);
23 printfQuda(
"%s: Detected fixed real cofficients: using regular Mobius\n", __func__);
55 ApplyDomainWall4D(out, in, *
gauge, 0.0, 0.0,
nullptr,
nullptr, in, parity,
dagger,
commDim,
profile);
68 long long Ls = in.
X(4);
69 long long bulk = (Ls-2)*(in.
Volume()/
Ls);
71 flops += 72LL*(
long long)in.
Volume() + 96LL*bulk + 120LL*wall;
83 long long Ls = in.
X(4);
84 long long bulk = (Ls-2)*(in.
Volume()/
Ls);
86 flops += 48LL*(
long long)in.
Volume() + 96LL*bulk + 120LL*wall;
97 ApplyDomainWall4D(out, in, *
gauge, k,
m5,
b_5,
c_5, x, parity,
dagger,
commDim,
profile);
111 long long Ls = in.
X(4);
112 long long bulk = (Ls-2)*(in.
Volume()/
Ls);
114 flops += (72LL+48LL)*(
long long)in.
Volume() + 96LL*bulk + 120LL*wall;
127 long long Ls = in.
X(4);
128 long long bulk = (Ls-2)*(in.
Volume()/
Ls);
130 flops += (96LL)*(
long long)in.
Volume() + 96LL*bulk + 120LL*wall;
138 double kappa_b = 0.5 / (
b_5[0].real() * (4.0 +
m5) + 1.0);
144 bool reset =
newTmp(&tmp, in);
147 ApplyDomainWall4D(*tmp, out, *
gauge, 0.0,
m5,
b_5,
c_5, in,
QUDA_INVALID_PARITY,
dagger,
commDim,
profile);
151 long long Ls = in.
X(4);
152 long long bulk = (Ls - 2) * (in.
Volume() /
Ls);
153 long long wall = 2 * in.
Volume() /
Ls;
154 flops += 72LL * (
long long)in.
Volume() + 96LL * bulk + 120LL * wall;
156 flops += 48LL * (
long long)in.
Volume() + 96LL * bulk + 120LL * wall;
177 errorQuda(
"Preconditioned solution requires a preconditioned solve_type");
198 if (&dirac !=
this) {
215 using namespace blas;
222 long long Ls = in.
X(4);
223 flops += 144LL*(
long long)in.
Volume()*Ls + 3LL*Ls*(Ls-1LL);
236 long long Ls = in.
X(4);
237 flops += (144LL*Ls + 48LL)*(
long long)in.
Volume() + 3LL*Ls*(Ls-1LL);
252 if (symmetric && !
dagger) {
259 }
else if (symmetric &&
dagger) {
266 }
else if (!symmetric && !
dagger) {
273 }
else if (!symmetric &&
dagger) {
DiracMobiusPC(const DiracParam ¶m)
void Dslash5(ColorSpinorField &out, const ColorSpinorField &in, const QudaParity parity) const
QudaVerbosity getVerbosity()
virtual void checkFullSpinor(const ColorSpinorField &, const ColorSpinorField &) const
Complex b_5[QUDA_MAX_DWF_LS]
cudaColorSpinorField * tmp
const ColorSpinorField & Even() const
void deleteTmp(ColorSpinorField **, const bool &reset) const
const ColorSpinorField & Odd() const
void reconstruct(ColorSpinorField &x, const ColorSpinorField &b, const QudaSolutionType) const
Complex c_5[QUDA_MAX_DWF_LS]
Complex c_5[QUDA_MAX_DWF_LS]
void ApplyDslash5(ColorSpinorField &out, const ColorSpinorField &in, const ColorSpinorField &x, double m_f, double m_5, const Complex *b_5, const Complex *c_5, double a, bool dagger, Dslash5Type type)
Apply either the domain-wall / mobius Dslash5 operator or the M5 inverse operator. In the current implementation, it is expected that the color-spinor fields are 4-d preconditioned.
void M(ColorSpinorField &out, const ColorSpinorField &in) const
void Dslash5invXpay(ColorSpinorField &out, const ColorSpinorField &in, const QudaParity parity, const ColorSpinorField &x, const double &k) const
double norm2(const CloverField &a, bool inverse=false)
bool newTmp(ColorSpinorField **, const ColorSpinorField &) const
virtual void MdagM(ColorSpinorField &out, const ColorSpinorField &in) const
int commDim[QUDA_MAX_DIM]
void Dslash4(ColorSpinorField &out, const ColorSpinorField &in, const QudaParity parity) const
Complex b_5[QUDA_MAX_DWF_LS]
DiracMobius(const DiracParam ¶m)
void checkDWF(const ColorSpinorField &out, const ColorSpinorField &in) const
DiracDomainWall & operator=(const DiracDomainWall &dirac)
void checkSpinorAlias(const ColorSpinorField &, const ColorSpinorField &) const
void axpy(double a, ColorSpinorField &x, ColorSpinorField &y)
QudaSiteSubset SiteSubset() const
virtual void M(ColorSpinorField &out, const ColorSpinorField &in) const
virtual void reconstruct(ColorSpinorField &x, const ColorSpinorField &b, const QudaSolutionType) const
enum QudaSolutionType_s QudaSolutionType
void Dslash4pre(ColorSpinorField &out, const ColorSpinorField &in, const QudaParity parity) const
std::complex< double > Complex
void Dslash4preXpay(ColorSpinorField &out, const ColorSpinorField &in, const QudaParity parity, const ColorSpinorField &x, const double &k) const
void ApplyDomainWall4D(ColorSpinorField &out, const ColorSpinorField &in, const GaugeField &U, double a, double m_5, const Complex *b_5, const Complex *c_5, const ColorSpinorField &x, int parity, bool dagger, const int *comm_override, TimeProfile &profile)
Driver for applying the batched Wilson 4-d stencil to a 5-d vector with 4-d preconditioned data order...
enum QudaParity_s QudaParity
void Dslash4Xpay(ColorSpinorField &out, const ColorSpinorField &in, const QudaParity parity, const ColorSpinorField &x, const double &k) const
void Mdag(ColorSpinorField &out, const ColorSpinorField &in) const
void prepare(ColorSpinorField *&src, ColorSpinorField *&sol, ColorSpinorField &x, ColorSpinorField &b, const QudaSolutionType) const
cpuColorSpinorField * out
void MdagM(ColorSpinorField &out, const ColorSpinorField &in) const
void Dslash5Xpay(ColorSpinorField &out, const ColorSpinorField &in, const QudaParity parity, const ColorSpinorField &x, const double &k) const
virtual void checkParitySpinor(const ColorSpinorField &, const ColorSpinorField &) const
void Dslash5inv(ColorSpinorField &out, const ColorSpinorField &in, const QudaParity parity) const
DiracMobiusPC & operator=(const DiracMobiusPC &dirac)
DiracMobius & operator=(const DiracMobius &dirac)
virtual void prepare(ColorSpinorField *&src, ColorSpinorField *&sol, ColorSpinorField &x, ColorSpinorField &b, const QudaSolutionType) const