13 #include <Eigen/Dense> 20 using namespace Eigen;
32 r(nullptr), Av(nullptr), r_sloppy(nullptr), Av_sloppy(nullptr) {
69 printfQuda(
"Deflation space setup completed\n");
102 if(nevs_to_print == 0)
errorQuda(
"\nIncorrect size of current deflation space. \n");
109 std::unique_ptr<double[] > evals(
new double[
param.
ld]);
112 errorQuda(
"MAGMA library was not built.\n");
118 SelfAdjointEigenSolver<MatrixXcd> es_projm( projm_ );
125 std::vector<ColorSpinorField*> res;
128 for(
int i = 0;
i < nevs_to_print;
i++)
140 double eval = dotnorm.x / dotnorm.z;
146 printfQuda(
"Eigenvalue %d: %1.12e Residual: %1.12e\n",
i+1, eval, relerr);
160 double check_nrm2 =
norm2(
b);
168 std::vector<ColorSpinorField*> in_;
169 in_.push_back(static_cast<ColorSpinorField*>(b_sloppy));
179 errorQuda(
"MAGMA library was not built.\n");
183 Map<VectorXcd, Unaligned> vec_ (vec.get(),
param.
cur_dim);
186 vec2_ = projm_.fullPivHouseholderQr().solve(vec_);
196 std::vector<ColorSpinorField*> out_;
202 printfQuda(
"\nDeflated guess spinor norm (gpu): %1.15e\n",
sqrt(check_nrm2));
211 if(
nev == 0 )
return;
216 warningQuda(
"\nNot enough space to add %d vectors. Keep deflation space unchanged.\n",
nev);
222 printfQuda(
"\nConstruct projection matrix..\n");
226 const int cdot_pipeline_length = 4;
228 for(
int i = first_idx;
i < (first_idx +
nev);
i++)
230 std::unique_ptr<Complex[] > alpha(
new Complex[
i]);
238 const int local_length = (
i -
offset) > cdot_pipeline_length ? cdot_pipeline_length : (
i -
offset);
241 std::vector<ColorSpinorField*> vi_;
242 vi_.push_back(accum);
245 for (
int j = 0; j < local_length; j++) alpha[j] = -alpha[j];
249 offset += cdot_pipeline_length;
254 if(alpha[0].real() > 1
e-16)
blas::ax(1.0 /
sqrt(alpha[0].real()), *accum);
255 else errorQuda(
"\nCannot orthogonalize %dth vector\n",
i);
266 std::vector<ColorSpinorField*> av_;
271 for (
int j = 0; j <
i; j++) {
288 printf(
"\nToo big number of eigenvectors was requested, switched to maximum available number %d\n",
param.
cur_dim);
292 std::unique_ptr<double[] > evals(
new double[
param.
cur_dim]);
301 errorQuda(
"MAGMA library was not built.\n");
305 Map<VectorXd, Unaligned> evals_(evals.get(),
param.
cur_dim);
307 SelfAdjointEigenSolver<MatrixXcd> es(projm_);
309 projm_ = es.eigenvectors();
310 evals_ = es.eigenvalues();
319 if(
fabs(evals[
i]) > 1
e-16)
325 errorQuda(
"\nCannot invert Ritz value.\n");
334 csParam.composite_dim = max_nev;
341 bool do_residual_check = (
tol != 0.0);
343 while ((relerr <
tol) && (
idx < max_nev))
346 std::vector<ColorSpinorField*> res;
353 if( do_residual_check )
360 double eval = dotnorm.x / dotnorm.z;
393 std::vector<ColorSpinorField*> &B = RV->
Components();
395 const int Nvec = B.size();
398 void **
V =
new void*[Nvec];
399 for (
int i=0;
i<Nvec;
i++) {
408 B[0]->Ncolor(), B[0]->Nspin(), Nvec, 0, (
char**)0);
410 errorQuda(
"No eigenspace file defined.");
429 std::vector<ColorSpinorField*> &B = RV->
Components();
432 const int Nvec = B.size();
435 void **
V =
static_cast<void**
>(
safe_malloc(Nvec*
sizeof(
void*)));
436 for (
int i=0;
i<Nvec;
i++) {
444 B[0]->Ncolor(), B[0]->Nspin(), Nvec, 0, (
char**)0);
void xpay(ColorSpinorField &x, const double &a, ColorSpinorField &y)
#define pool_pinned_free(ptr)
double3 cDotProductNormA(ColorSpinorField &a, ColorSpinorField &b)
QudaVerbosity getVerbosity()
double norm2(const ColorSpinorField &a)
QudaInverterType inv_type
__host__ __device__ ValueType sqrt(ValueType x)
Complex cDotProduct(ColorSpinorField &, ColorSpinorField &)
std::complex< double > Complex
CompositeColorSpinorField & Components()
static ColorSpinorField * Create(const ColorSpinorParam ¶m)
void copy(ColorSpinorField &dst, const ColorSpinorField &src)
void ax(const double &a, ColorSpinorField &x)
DiracMatrix & matDeflation
ColorSpinorField & Component(const int idx) const
void reduce(double tol, int max_nev)
double norm2(const CloverField &a, bool inverse=false)
int strcmp(const char *__s1, const char *__s2)
Deflation(DeflationParam ¶m, TimeProfile &profile)
QudaInvertParam * invert_param
void magma_Xheev(void *Mat, const int n, const int ldm, void *evalues, const int prec)
int printf(const char *,...) __attribute__((__format__(__printf__
Stride< Dynamic, Dynamic > DynamicStride
void saveVectors(ColorSpinorField *RV)
Save the eigen space vectors in file.
QudaFieldLocation location
QudaBoolean import_vectors
void caxpy(const Complex &a, ColorSpinorField &x, ColorSpinorField &y)
double flops() const
Return the total flops done on this and all coarser levels.
void * memcpy(void *__dst, const void *__src, size_t __n)
#define safe_malloc(size)
void zero(ColorSpinorField &a)
ColorSpinorField * Av_sloppy
#define pool_pinned_malloc(size)
void operator()(ColorSpinorField &out, ColorSpinorField &in)
void loadVectors(ColorSpinorField *RV)
Load the eigen space vectors from file.
QudaExtLibType extlib_type
void write_spinor_field(const char *filename, void *V[], QudaPrecision precision, const int *X, int nColor, int nSpin, int Nvec, int argc, char *argv[])
void increment(ColorSpinorField &V, int nev)
ColorSpinorField * r_sloppy
QudaEigParam & eig_global
__host__ __device__ ValueType conj(ValueType x)
QudaPrecision Precision() const
QudaPrecision cuda_prec_ritz
__device__ __host__ void zero(vector_type< scalar, n > &v)
void read_spinor_field(const char *filename, void *V[], QudaPrecision precision, const int *X, int nColor, int nSpin, int Nvec, int argc, char *argv[])
static auto pinned_allocator
static auto pinned_deleter
void magma_Xgesv(void *sol, const int ldn, const int n, void *Mat, const int ldm, const int prec)