7 #include <Eigen/Sparse> 8 #include <arpack++/arlnsmat.h> 9 #include <arpack++/arlssym.h> 10 #include <ATSuite/atio.hpp> 21 typedef SparseMatrix<double, RowMajor>
SpMatCSR;
23 typedef SparseMatrix<double, ColMajor>
SpMatCSC;
39 configAR(
const std::string&,
int,
double,
int,
double *,
bool);
43 ARluNonSymMatrix<double, double> *
pajek2AR(FILE *);
45 ARluNonSymMatrix<double, double> *
Eigen2AR(SpMatCSR *);
49 int getSpectrum(ARluNonSymMatrix<double, double> *,
int,
configAR,
double *,
double *,
double *);
50 void writeSpectrum(FILE *, FILE *,
double *,
double *,
double *,
int,
size_t);
59 int maxit=0,
double *resid=NULL,
bool AutoShift=
true)
79 ARluNonSymMatrix<double, double> *
pajek2AR(FILE *fp)
87 ARluNonSymMatrix<double, double> *T =
new ARluNonSymMatrix<double, double>;
90 fscanf(fp,
"%s %d", label, &N);
94 for (
int k = 0; k < N; k++)
95 fscanf(fp,
"%d %s", &row, label);
98 fscanf(fp,
"%s %d", label, &E);
100 nzval =
new double [E];
101 for (
int k = 0; k < N+1; k++)
105 for (
int k = 0; k < E; k++){
106 fscanf(fp,
"%d %d %lf", &row, &col, &val);
108 printf(
"irow[%d] = %d\n", k, row);
115 T->DefineMatrix(N, E, nzval, irow, pcol, 0.1, 2,
true);
131 int innerSize, outerSize, nnz;
135 ARluNonSymMatrix<double, double> *T =
new ARluNonSymMatrix<double, double>;
138 fscanf(fp,
"%s %d %d %d", sparseType, &innerSize, &outerSize, &nnz);
139 nzval =
new double [nnz];
140 irow =
new int [nnz];
141 pcol =
new int[outerSize+1];
144 for (
int nz = 0; nz < nnz; nz++)
145 fscanf(fp,
"%lf ", &nzval[nz]);
148 for (
int nz = 0; nz < nnz; nz++)
149 fscanf(fp,
"%d ", &irow[nz]);
152 for (
int outer = 0; outer < outerSize+1; outer++)
153 fscanf(fp,
"%d ", &pcol[outer]);
156 T->DefineMatrix(outerSize, nnz, nzval, irow, pcol, 0.1, 2,
true);
173 ARluNonSymMatrix<double, double> *T =
new ARluNonSymMatrix<double, double>;
175 outerSize = TEigen->outerSize();
176 nnz = TEigen->nonZeros();
177 nzval =
new double [nnz];
178 irow =
new int [nnz];
179 pcol =
new int [outerSize+1];
182 nzval = TEigen->valuePtr();
185 irow = TEigen->innerIndexPtr();
188 pcol = TEigen->outerIndexPtr();
191 T->DefineMatrix(outerSize, nnz, nzval, irow, pcol, 0.1, 2,
true);
203 ARluNonSymMatrix<double, double>*
Eigen2AR(SpMatCSR *TEigenCSR)
206 ARluNonSymMatrix<double, double> *T;
227 double *nzval, *nzvalSym;
228 int *irow, *pcol, *irowSym, *pcolSym;
229 ARluSymMatrix<double> *T =
new ARluSymMatrix<double>;
230 int nzIdx, nzSymIdx, innerIdx;
233 outerSize = TEigen->outerSize();
234 nnz = TEigen->nonZeros();
235 nzval =
new double [nnz];
236 irow =
new int [nnz];
237 pcol =
new int [outerSize+1];
238 nzvalSym =
new double [(int) ((nnz-outerSize)/2)+outerSize+1];
239 irowSym =
new int [(int) ((nnz-outerSize)/2)+outerSize+1];
240 pcolSym =
new int [outerSize+1];
243 nzval = TEigen->valuePtr();
245 irow = TEigen->innerIndexPtr();
247 pcol = TEigen->outerIndexPtr();
252 for (
int outerIdx = 0; outerIdx < outerSize; outerIdx++){
254 while (nzIdx < pcol[outerIdx+1]){
255 innerIdx = irow[nzIdx];
256 if (outerIdx >= innerIdx){
257 nzvalSym[nzSymIdx] = nzval[nzIdx];
258 irowSym[nzSymIdx] = irow[nzIdx];
260 pcolSym[outerIdx] = nzSymIdx;
269 pcolSym[outerIdx] = nzSymIdx;
271 pcolSym[outerSize] = nzSymIdx;
274 T->DefineMatrix(outerSize, nzSymIdx, nzvalSym, irowSym, pcolSym,
290 ARluSymMatrix<double> *T;
315 double *EigValReal,
double *EigValImag,
double *EigVec)
317 ARluNonSymStdEig<double> EigProb;
321 EigProb = ARluNonSymStdEig<double>(nev, *P, cfgAR.
which_, cfgAR.
ncv_, cfgAR.
tol_,
325 EigProb.EigenValVectors(EigVec, EigValReal, EigValImag);
326 nconv = EigProb.ConvergedEigenvalues();
345 double *EigValReal,
double *EigValImag,
346 double *EigVec,
int nev,
size_t N)
354 fprintf(fEigVal,
"%lf %lf\n", EigValReal[ev], EigValImag[ev]);
356 for (
size_t i = 0; i < N; i++){
357 fprintf(fEigVec,
"%lf ", EigVec[vecCount*N+i]);
359 fprintf(fEigVec,
"\n");
363 if (EigValImag[ev] != 0.){
364 for (
size_t i = 0; i < N; i++)
365 fprintf(fEigVec,
"%lf ", EigVec[vecCount*N+i]);
371 for (
size_t i = 0; i < N; i++)
372 fprintf(fEigVec,
"%lf ", 0.);
375 fprintf(fEigVec,
"\n");
SparseMatrix< double, RowMajor > SpMatCSR
Eigen sparse CSR matrix of double type.
bool AutoShift_
Shifts for the implicit restarting of the Arnoldi method.
void writeSpectrum(FILE *, FILE *, double *, double *, double *, int, size_t)
Write complex eigenvalues and eigenvectors from ARPACK++.
SpMatCSC * CSR2CSC(const SpMatCSR *T)
Convert an Eigen CSR matrix to an Eigen CSC matrix.
int ncv_
The number of Arnoldi vectors generated at each iteration of ARPACK.
ARluNonSymMatrix< double, double > * pajek2AR(FILE *)
Scans an ARPACK++ nonsymmetric matrix from a Pajek file.
int getSpectrum(ARluNonSymMatrix< double, double > *, int, configAR, double *, double *, double *)
Get spectrum of a nonsymmetric matrix using ARPACK++.
configAR(const std::string &, int, double, int, double *, bool)
Main constructor.
std::string which_
Which eigenvalues to look for. 'LM' for Largest Magnitude.
SparseMatrix< double, ColMajor > SpMatCSC
Eigen sparse CSC matrix of double type.
ARluNonSymMatrix< double, double > * Compressed2AR(FILE *)
Scans an ARPACK++ nonsymmetric matrix from a file in compressed format.
double tol_
The relative accuracy to which eigenvalues are to be determined.
Utility class used to give configuration options to ARPACK++.
ARluNonSymMatrix< double, double > * Eigen2AR(SpMatCSC *)
Converts an Eigen CSC matrix to an ARPACK++ nonsymmetric CSC matrix.
int maxit_
The maximum number of iterations allowed.
double * resid_
A starting vector for the Arnoldi process.
ARluSymMatrix< double > * Eigen2ARSym(SpMatCSC *)
Converts an Eigen CSC matrix to an ARPACK++ symmetric CSC matrix.
Eigen::SparseMatrix< double, Eigen::ColMajor > SpMatCSC
Eigen sparse CSC matrix of double type.