private static bool EnsureSuccess(SpectraResult result) { try { result.EnsureSuccess(); return(true); } catch (SpectraException e) { Console.WriteLine(e.Message); } return(false); }
/// <summary> /// Prints eigenvalues and eigenvectors of nonsymmetric generalized eigen-problems. /// </summary> public static void General(SparseMatrix A, SparseMatrix B, SpectraResult result, bool shift, bool cshift = false) { if (!EnsureSuccess(result)) { return; } int n = A.RowCount; int nconv = result.ConvergedEigenValues; Console.WriteLine(); Console.WriteLine("Testing ARPACK++ class ARluNonSymGenEig"); Console.WriteLine("Real nonsymmetric generalized eigenvalue problem: A*x - lambda*B*x"); Console.WriteLine(!shift ? "Regular mode" : (cshift ? "Shift and invert mode (using the imaginary part of OP)" : "Shift and invert mode (using the real part of OP)")); Console.WriteLine(); Console.WriteLine("Dimension of the system : " + n); Console.WriteLine("Number of 'requested' eigenvalues : " + result.Count); Console.WriteLine("Number of 'converged' eigenvalues : " + nconv); Console.WriteLine("Number of Arnoldi vectors generated: " + result.ArnoldiCount); Console.WriteLine("Number of iterations taken : " + result.IterationsTaken); Console.WriteLine(); var evals = result.EigenValues; var evecs = result.EigenVectors; // Printing eigenvalues. Console.WriteLine("Eigenvalues:"); for (int i = 0; i < nconv; i++) { Console.WriteLine(" lambda[" + (i + 1) + "]: " + evals[i]); } Console.WriteLine(); if (evecs != null) { // Printing the residual norm || A*x - lambda*B*x || // for the nconv accurately computed eigenvectors. var x = new Complex[n]; var y = new Complex[n]; var r = new double[nconv]; // residuals for (int i = 0; i < nconv; i++) { var lambda = evals[i]; evecs.Column(i, x); CVector.Copy(x, y); // y = B*x B.Multiply(x, y); // y = A*x - lambda*B*x A.Multiply(1.0, x, -lambda, y); r[i] = CVector.Norm(y) / Complex.Abs(lambda); } for (int i = 0; i < nconv; i++) { Console.WriteLine("||A*x(" + i + ") - lambda(" + i + ")*B*x(" + i + ")||: " + r[i]); } Console.WriteLine(); } }
/// <summary> /// Prints eigenvalues and eigenvectors of symmetric generalized eigen-problems. /// </summary> public static void Symmetric(SparseMatrix A, SparseMatrix B, SpectraResult result, ShiftMode mode) { if (!EnsureSuccess(result)) { return; } int n = A.RowCount; int nconv = result.ConvergedEigenValues; Console.WriteLine(); Console.WriteLine("Testing ARPACK++ class ARluSymGenEig"); Console.WriteLine("Real symmetric generalized eigenvalue problem: A*x - lambda*B*x"); Console.WriteLine(); switch (mode) { case ShiftMode.None: Console.WriteLine("Regular mode"); break; case ShiftMode.Regular: Console.WriteLine("Shift and invert mode"); break; case ShiftMode.Buckling: Console.WriteLine("Buckling mode"); break; case ShiftMode.Cayley: Console.WriteLine("Cayley mode"); break; } Console.WriteLine(); Console.WriteLine("Dimension of the system : " + n); Console.WriteLine("Number of 'requested' eigenvalues : " + result.Count); Console.WriteLine("Number of 'converged' eigenvalues : " + nconv); Console.WriteLine("Number of Arnoldi vectors generated: " + result.ArnoldiCount); Console.WriteLine("Number of iterations taken : " + result.IterationsTaken); Console.WriteLine(); var evals = result.EigenValuesReal(); var evecs = result.EigenVectorsReal(); // Printing eigenvalues. Console.WriteLine("Eigenvalues:"); for (int i = 0; i < nconv; i++) { Console.WriteLine(" lambda[" + (i + 1) + "]: " + evals[i]); } Console.WriteLine(); if (evecs != null) { // Printing the residual norm || A*x - lambda*B*x || // for the nconv accurately computed eigenvectors. var x = new double[n]; var y = new double[n]; var r = new double[nconv]; // residuals for (int i = 0; i < nconv; i++) { var lambda = evals[i]; evecs.Column(i, x); Vector.Copy(x, y); // y = B*x B.Multiply(x, y); // y = A*x - lambda*B*x A.Multiply(1.0, x, -lambda, y); r[i] = Vector.Norm(y) / Math.Abs(lambda); } for (int i = 0; i < nconv; i++) { Console.WriteLine("||A*x(" + i + ") - lambda(" + i + ")*B*x(" + i + ")||: " + r[i]); } Console.WriteLine(); } }