int SparseEigenSolver( CSR3_sym_matrix<double, std::int32_t>& A, CSR3_sym_matrix<double, std::int32_t>& B, Matrix<double, M_PROP::GE, M_SHAPE::RE, M_ORD::COL>& Z, Vector<double>& L, Vector<double>& eigen_error, double eigenv_max, int toll_exp, int max_iter, std::ostream& log) { typedef MML3_INT_TYPE int_t; int len=100; char buf[100]; //MKLGetVersionString(buf, len); mkl_get_version_string(buf, len); log << "\tSolutore modale per matrici sparse basato su:\n" << "\tMKL-FEAST: " << std::string(buf,len); log << "\n\tCaratteristiche del sistema:" << "\n\t\tN : " << A.nrows() << "\n\t\tNNZ(A) : " << A.nonzeros() << "\n\t\tNNZ(B) : " << B.nonzeros() << std::endl; if (A.nrows() != B.nrows()) { log << "LinearEigenSolver: dimensioni di A e B incompatibili \n"; return -1; } Vector<int_t> fpm(128); feastinit(fpm.data()); fpm(1) = 1; // manda in output messAGGI a runtime fpm(2) = 8; // numero di punti di quadratura (default=)8 if (toll_exp) fpm(3) =toll_exp; // tolleranza 10^-fpm(3) if (max_iter) fpm(4) = max_iter; fpm(64) = 0; // use PARDISO int_t n = A.nrows(); double epsout = 0.; int_t loop = 0; double emin = 0.; int_t subspace_dim = std::min(Z.ncols(),n); // m0 in feast routine int_t founded_eig = 0; // feast m int_t info = 0; const char uplo = 'U'; log << "\n\tParmetri algoritmici:" << "\n\t\tintervallo autovalori : [" << emin << "," << eigenv_max << "]" << "\n\t\tdimensione sottospazio : " << subspace_dim << "\n\t\ttolleranza : 10E-" << fpm(3) << "\n\t\titerazioni massime : " << fpm(4) << std::endl; log << "\n ................ Inizio messaggi solutore .................\n\n"; dfeast_scsrgv(&uplo, &n, A.column_value(), A.row_pos(), A.column_index(), B.column_value(), B.row_pos(), B.column_index(), fpm.data(), &epsout, &loop, &emin, &eigenv_max, &subspace_dim, L.data(), Z.data(), &founded_eig, eigen_error.data(), &info); log << "\n ................ Fine messaggi solutore ...................\n\n"; if (info != 0) return info; Vector<double> tmp_L(L.data(), founded_eig); L.swap(tmp_L); return info; }
int main() { /*!!!!!!!!!!!!!!!!! Feast declaration variable */ int feastparam[64]; double epsout; int loop; char UPLO='F'; /*!!!!!!!!!!!!!!!!! Matrix declaration variable */ FILE *fp; char name[]="../../system1"; int N,nnz; double *sa,*sb; int *isa,*jsa; /*!!!!!!!!!!!!!!!!! Others */ struct timeval t1, t2; int i,k,err; int M0,M,info; double Emin,Emax,trace; double *X; //! eigenvectors double *E,*res; //! eigenvalue+residual /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! read input file in csr format!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ // !!!!!!!!!! form CSR arrays isa,jsa,sa fp = fopen (name, "r"); err=fscanf (fp, "%d%d\n",&N,&nnz); sa=calloc(nnz,sizeof(double)); sb=calloc(nnz,sizeof(double)); isa=calloc(N+1,sizeof(int)); jsa=calloc(nnz,sizeof(int)); for (i=0;i<=N;i++){ *(isa+i)=0; }; *(isa)=1; for (k=0;k<=nnz-1;k++){ err=fscanf(fp,"%d%d%lf%lf\n",&i,jsa+k,sa+k,sb+k); *(isa+i)=*(isa+i)+1; }; fclose(fp); for (i=1;i<=N;i++){ *(isa+i)=*(isa+i)+*(isa+i-1); }; /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! INFORMATION ABOUT MATRIX !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ printf("sparse matrix -system1- size %.d\n",N); printf("nnz %d \n",nnz); gettimeofday(&t1,NULL); /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! FEAST in sparse format !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ /*!!! search interval [Emin,Emax] including M eigenpairs*/ Emin=(double) 0.18; Emax=(double) 1.0; M0=25; // !! M0>=M /*!!!!!!!!!!!!! ALLOCATE VARIABLE */ E=calloc(M0,sizeof(double)); // eigenvalues res=calloc(M0,sizeof(double));// eigenvectors X=calloc(N*M0,sizeof(double));// residual (if needed) /*!!!!!!!!!!!! FEAST */ feastinit(feastparam); feastparam[0]=1; /*change from default value */ dfeast_scsrgv(&UPLO,&N,sa,isa,jsa,sb,isa,jsa,feastparam,&epsout,&loop,&Emin,&Emax,&M0,E,X,&M,res,&info); gettimeofday(&t2,NULL); /*!!!!!!!!!! REPORT !!!!!!!!!*/ printf("FEAST OUTPUT INFO %d\n",info); if (info==0) { printf("*************************************************\n"); printf("************** REPORT ***************************\n"); printf("*************************************************\n"); printf("SIMULATION TIME %f\n",(t2.tv_sec-t1.tv_sec)*1.0+(t2.tv_usec-t1.tv_usec)*0.000001); printf("# Search interval [Emin,Emax] %.15e %.15e\n",Emin,Emax); printf("# mode found/subspace %d %d \n",M,M0); printf("# iterations %d \n",loop); trace=(double) 0.0; for (i=0;i<=M-1;i=i+1){ trace=trace+*(E+i); } printf("TRACE %.15e\n", trace); printf("Relative error on the Trace %.15e\n",epsout ); printf("Eigenvalues/Residuals\n"); for (i=0;i<=M-1;i=i+1){ printf(" %d %.15e %.15e\n",i,*(E+i),*(res+i)); } } return 0; }