📄 nsymsol.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 + -