示例#1
0
	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;
		
}
示例#2
0
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;
}