24 std::vector<ColorSpinorField*>
a(
size),
b(1);
25 for (
int k=0; k<
size; k++)
33 for (
int k=0; k<
size; k++)
35 tau[begin+k][j] = Tau[k]/
sigma[begin+k];
46 tau_[
i] = -
tau[
i+begin][j];
49 std::vector<ColorSpinorField*> r_(
r.begin() + begin,
r.begin() + begin +
size);
50 std::vector<ColorSpinorField*> rj(
r.begin() + j,
r.begin() + j + 1);
63 for (
int i=1;
i<j;
i++)
75 for (
int i=1;
i<j-1;
i++)
96 for (step = 0; step < (j-1)/N; step++)
125 std::vector<ColorSpinorField*> u_(
u.begin() + 1,
u.end());
126 std::vector<ColorSpinorField*> u0(
u.begin(),
u.begin() + 1);
152 gamma_prime_prime_[0] =
gamma[1];
153 gamma_prime_prime_[
nKrylov] = 0.0;
154 gamma_prime_[0] = 0.0;
163 delete[] gamma_prime_prime_;
164 delete[] gamma_prime_;
190 std::vector<ColorSpinorField*> &
r;
191 std::vector<ColorSpinorField*> &
u;
227 static int count = 0;
277 std::stringstream ss;
319 if (rNorm > maxrx) maxrx = rNorm;
320 if (rNorm > maxrr) maxrr = rNorm;
409 errorQuda(
"Null vector computing requires non-zero guess!");
472 const bool use_heavy_quark_res =
497 double rNorm =
sqrt(r2);
498 double maxrr = rNorm;
499 double maxrx = rNorm;
508 for (
int j = 0; j <
nKrylov; j++) {
525 bicgstabl_update.update_j_max(j);
549 bicgstabl_update.update_j_max(j);
562 for (
int j = 1; j <=
nKrylov; j++)
594 for (
int j =
nKrylov-1; j > 0; j--)
605 for (
int j = 1; j <
nKrylov; j++)
632 if (use_heavy_quark_res && k%heavy_quark_check==0) {
670 if (
x.Precision() !=
r[0]->Precision())
bool convergence(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)
ColorSpinorField * x_sloppy_saved_p
void update_update_type(BiCGstabLUpdateType new_update_type)
ColorSpinorField * yp
Full precision residual.
static double stopping(const double &tol, const double &b2, QudaResidualType residual_type)
double3 cDotProductNormA(ColorSpinorField &a, ColorSpinorField &b)
ColorSpinorField * r0_saved_p
Sloppy solution vector.
QudaVerbosity getVerbosity()
double norm2(const ColorSpinorField &a)
__host__ __device__ ValueType sqrt(ValueType x)
Complex cDotProduct(ColorSpinorField &, ColorSpinorField &)
std::complex< double > Complex
BiCGstabL(DiracMatrix &mat, DiracMatrix &matSloppy, SolverParam ¶m, TimeProfile &profile)
double3 xpyHeavyQuarkResidualNorm(ColorSpinorField &x, ColorSpinorField &y, ColorSpinorField &r)
static ColorSpinorField * Create(const ColorSpinorParam ¶m)
void computeTau(Complex **tau, double *sigma, std::vector< ColorSpinorField *> r, int begin, int size, int j)
void copy(ColorSpinorField &dst, const ColorSpinorField &src)
double xmyNorm(ColorSpinorField &x, ColorSpinorField &y)
std::vector< ColorSpinorField * > u
QudaPreserveSource preserve_source
ColorSpinorField * r_fullp
BiCGstabLUpdate(ColorSpinorField *x, std::vector< ColorSpinorField *> &r, std::vector< ColorSpinorField *> &u, Complex *alpha, Complex *beta, BiCGstabLUpdateType update_type, int j_max, int n_update)
void caxpyBxpz(const Complex &, ColorSpinorField &, ColorSpinorField &, const Complex &, ColorSpinorField &)
QudaComputeNullVector compute_null_vector
std::vector< ColorSpinorField * > & u
double Last(QudaProfileType idx)
Complex * gamma_prime_prime
void PrintSummary(const char *name, int k, const double &r2, const double &b2)
static unsigned int delta
QudaResidualType residual_type
void apply(const cudaStream_t &stream)
bool is_preconditioner
verbosity to use for preconditioner
double3 HeavyQuarkResidualNorm(ColorSpinorField &x, ColorSpinorField &r)
std::vector< ColorSpinorField * > r
Sloppy temporary vector.
void orthoDir(Complex **tau, double *sigma, std::vector< ColorSpinorField *> r, int j, int pipeline)
const DiracMatrix & matSloppy
void updateUend(Complex *gamma, std::vector< ColorSpinorField *> u, int nKrylov)
Complex caxpyDotzy(const Complex &a, ColorSpinorField &x, ColorSpinorField &y, ColorSpinorField &z)
double gamma(double) __attribute__((availability(macosx
void caxpy(const Complex &a, ColorSpinorField &x, ColorSpinorField &y)
void zero(ColorSpinorField &a)
ColorSpinorField * tempp
Full precision temporary.
int reliable(double &rNorm, double &maxrx, double &maxrr, const double &r2, const double &delta)
Current residual, in BiCG language.
void updateR(Complex **tau, std::vector< ColorSpinorField *> r, int begin, int size, int j)
unsigned long long flops() const
void PrintStats(const char *, int k, const double &r2, const double &b2, const double &hq2)
void updateXRend(Complex *gamma, Complex *gamma_prime, Complex *gamma_prime_prime, std::vector< ColorSpinorField *> r, ColorSpinorField &x, int nKrylov)
ColorSpinorField * r_sloppy_saved_p
Shadow residual, in BiCG language.
void xpy(ColorSpinorField &x, ColorSpinorField &y)
virtual int getStencilSteps() const =0
void caxpby(const Complex &a, ColorSpinorField &x, const Complex &b, ColorSpinorField &y)
std::vector< ColorSpinorField * > & r
virtual ~BiCGstabLUpdate()
QudaUseInitGuess use_init_guess
QudaPrecision precision_sloppy
bool use_sloppy_partial_accumulator
void update_j_max(int new_j_max)
void mat(void *out, void **link, void *in, int dagger_bit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision)
QudaPrecision Precision() const
__device__ unsigned int count[QUDA_MAX_MULTI_REDUCE]
BiCGstabLUpdateType update_type
void operator()(ColorSpinorField &out, ColorSpinorField &in)