⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nsymsol.h

📁 ARPACK is a collection of Fortran77 subroutines designed to solve large scale eigenvalue problems.
💻 H
字号:
/*   ARPACK++ v1.0 8/1/1997   c++ interface to ARPACK code.   MODULE NSymSol.h   Template functions that exemplify how to print information    about nonsymmetric standard  eigenvalue problems.   ARPACK Authors      Richard Lehoucq      Danny Sorensen      Chao Yang      Dept. of Computational & Applied Mathematics      Rice University      Houston, Texas*/#ifndef NSYMSOL_H#define NSYMSOL_H#include <math.h>#include "blas1c.h"#include "lapackc.h"#include "matprod.h"#include "arsnsym.h"template<class MATRIX, class FLOAT>void Solution(MATRIX &A, ARNonSymStdEig<FLOAT, MATRIX> &Prob)/*  Prints eigenvalues and eigenvectors of nonsymmetric eigen-problems  on standard "cout" stream.*/{  int   i, n, nconv, mode;  FLOAT *Ax;  FLOAT *ResNorm;  n     = Prob.GetN();  nconv = Prob.ConvergedEigenvalues();  mode  = Prob.GetMode();  cout << endl << endl << "Testing ARPACK++ class ARNonSymStdEig \n";  cout << "Real nonsymmetric eigenvalue problem: A*x - lambda*x" << endl;  switch (mode) {  case 1:    cout << "Regular mode" << endl << endl;    break;  case 3:    cout << "Shift and invert mode" << endl << endl;  }  cout << "Dimension of the system            : " << n             << endl;  cout << "Number of 'requested' eigenvalues  : " << Prob.GetNev() << endl;  cout << "Number of 'converged' eigenvalues  : " << nconv         << endl;  cout << "Number of Arnoldi vectors generated: " << Prob.GetNcv() << endl;  cout << "Number of iterations taken         : " << Prob.GetIter() << endl;  cout << endl;  if (Prob.EigenvaluesFound()) {    // Printing eigenvalues.    cout << "Eigenvalues:" << endl;    for (i=0; i<nconv; i++) {      cout << "  lambda[" << (i+1) << "]: " << Prob.EigenvalueReal(i);      if (Prob.EigenvalueImag(i)>=0.0) {        cout << " + " << Prob.EigenvalueImag(i) << " I" << endl;      }      else {        cout << " - " << fabs(Prob.EigenvalueImag(i)) << " I" << endl;      }    }    cout << endl;  }  if (Prob.EigenvectorsFound()) {    // Printing the residual norm || A*x - lambda*x ||    // for the nconv accurately computed eigenvectors.    Ax      = new FLOAT[n];    ResNorm = new FLOAT[nconv+1];    for (i=0; i<nconv; i++) {      if (Prob.EigenvalueImag(i)==0.0) { // Eigenvalue is real.        A.MultMv(Prob.RawEigenvector(i), Ax);        axpy(n, -Prob.EigenvalueReal(i), Prob.RawEigenvector(i), 1, Ax, 1);        ResNorm[i] = nrm2(n, Ax, 1)/fabs(Prob.EigenvalueReal(i));      }      else {                 // Eigenvalue is complex.        A.MultMv(Prob.RawEigenvector(i), Ax);        axpy(n, -Prob.EigenvalueReal(i), Prob.RawEigenvector(i), 1, Ax, 1);        axpy(n, Prob.EigenvalueImag(i), Prob.RawEigenvector(i+1), 1, Ax, 1);        ResNorm[i] = nrm2(n, Ax, 1);        A.MultMv(Prob.RawEigenvector(i+1), Ax);        axpy(n, -Prob.EigenvalueImag(i), Prob.RawEigenvector(i), 1, Ax, 1);        axpy(n, -Prob.EigenvalueReal(i), Prob.RawEigenvector(i+1), 1, Ax, 1);        ResNorm[i] = lapy2(ResNorm[i], nrm2(n, Ax, 1))/                     lapy2(Prob.EigenvalueReal(i), Prob.EigenvalueImag(i));        ResNorm[i+1] = ResNorm[i];        i++;      }    }    for (i=0; i<nconv; i++) {      cout << "||A*x(" << (i+1) << ") - lambda(" << (i+1);      cout << ")*x(" << (i+1) << ")||: " << ResNorm[i] << "\n";    }    cout << "\n";    delete[] Ax;    delete[] ResNorm;  }} // Solution#endif // NSYMSOL_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -