11 #include <Eigen/Dense> 17 using namespace Eigen;
62 printfQuda(
"Deflation space setup completed\n");
95 if (nevs_to_print == 0)
errorQuda(
"Incorrect size of current deflation space");
102 std::unique_ptr<double[] > evals(
new double[
param.
ld]);
105 errorQuda(
"MAGMA library was not built");
111 SelfAdjointEigenSolver<MatrixXcd> es_projm( projm_ );
118 std::vector<ColorSpinorField*> res;
121 for (
int i = 0; i < nevs_to_print; i++) {
127 double eval = dotnorm.x / dotnorm.z;
129 double relerr =
sqrt(
norm2(*r_sloppy) / dotnorm.z);
130 printfQuda(
"Eigenvalue %d: %1.12e Residual: %1.12e\n", i + 1, eval, relerr);
144 double check_nrm2 =
norm2(b);
152 std::vector<ColorSpinorField*> in_;
153 in_.push_back(static_cast<ColorSpinorField*>(b_sloppy));
162 errorQuda(
"MAGMA library was not built");
167 Map<VectorXcd, Unaligned> vec_(vec.get(),
param.
cur_dim);
170 vec2_ = projm_.fullPivHouseholderQr().solve(vec_);
179 std::vector<ColorSpinorField*> out_;
184 check_nrm2 =
norm2(x);
185 printfQuda(
"\nDeflated guess spinor norm (gpu): %1.15e\n",
sqrt(check_nrm2));
194 if( nev == 0 )
return;
199 warningQuda(
"\nNot enough space to add %d vectors. Keep deflation space unchanged.\n", nev);
205 printfQuda(
"\nConstruct projection matrix..\n");
209 const int cdot_pipeline_length = 4;
211 for (
int i = first_idx; i < (first_idx +
nev); i++) {
212 std::unique_ptr<Complex[]> alpha(
new Complex[i]);
219 const int local_length = (i - offset) > cdot_pipeline_length ? cdot_pipeline_length : (i - offset);
223 std::vector<ColorSpinorField *> vi_;
224 vi_.push_back(accum);
227 for (
int j = 0; j < local_length; j++) alpha[j] = -alpha[j];
230 offset += cdot_pipeline_length;
235 if (alpha[0].real() > 1e-16)
238 errorQuda(
"Cannot orthogonalize %dth vector", i);
249 std::vector<ColorSpinorField *> av_;
254 for (
int j = 0; j < i; j++) {
269 printf(
"\nToo big number of eigenvectors was requested, switched to maximum available number %d\n",
param.
cur_dim);
273 std::unique_ptr<double[]> evals(
new double[
param.
cur_dim]);
274 std::unique_ptr<Complex, decltype(pinned_deleter)> projm(
283 errorQuda(
"MAGMA library was not built");
288 Map<VectorXd, Unaligned> evals_(evals.get(),
param.
cur_dim);
289 SelfAdjointEigenSolver<MatrixXcd> es(projm_);
290 projm_ = es.eigenvectors();
291 evals_ = es.eigenvalues();
299 if (fabs(evals[i]) > 1e-16) {
311 csParam.composite_dim = max_nev;
318 bool do_residual_check = (tol != 0.0);
320 while ((relerr < tol) && (idx < max_nev)) {
322 std::vector<ColorSpinorField *> res;
329 if (do_residual_check) {
333 double eval = dotnorm.x / dotnorm.z;
342 printfQuda(
"\nReserved eigenvectors: %d\n", idx);
360 std::vector<ColorSpinorField *> &B = RV->
Components();
362 const int Nvec = B.size();
363 printfQuda(
"Start loading %d vectors from %s\n", Nvec, vec_infile.c_str());
365 void **
V =
new void*[Nvec];
366 for (
int i = 0; i < Nvec; i++) {
373 if (strcmp(vec_infile.c_str(),
"")!=0) {
375 B[0]->Ncolor(), B[0]->Nspin(), Nvec, 0, (
char**)0);
393 std::vector<ColorSpinorField*> &B = RV->
Components();
396 const int Nvec = B.size();
397 printfQuda(
"Start saving %d vectors to %s\n", Nvec, vec_outfile.c_str());
399 void **
V =
static_cast<void**
>(
safe_malloc(Nvec*
sizeof(
void*)));
400 for (
int i=0; i<Nvec; i++) {
408 B[0]->Ncolor(), B[0]->Nspin(), Nvec, 0, (
char**)0);
void ax(double a, ColorSpinorField &x)
#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 &)
CompositeColorSpinorField & Components()
static ColorSpinorField * Create(const ColorSpinorParam ¶m)
void copy(ColorSpinorField &dst, const ColorSpinorField &src)
DiracMatrix & matDeflation
ColorSpinorField & Component(const int idx) const
void reduce(double tol, int max_nev)
void xpay(ColorSpinorField &x, double a, ColorSpinorField &y)
double norm2(const CloverField &a, bool inverse=false)
Deflation(DeflationParam ¶m, TimeProfile &profile)
QudaInvertParam * invert_param
void magma_Xheev(void *Mat, const int n, const int ldm, void *evalues, const int prec)
Stride< Dynamic, Dynamic > DynamicStride
void saveVectors(ColorSpinorField *RV)
Save the eigen space vectors in file.
std::complex< double > Complex
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.
#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)