Support for Microsoft's non-standard complex types (#334)

Replaced _Complex types with a_fcomplex and a_dcomplex in all C/C++ files.
Replaced uses of I and _Complex_I with the CMPLXand CMPLXF constructors.
For MSVC, defined those constructors as macros that call MSVC's functions.
Updated the CHANGES file.
This commit is contained in:
Juan José García Ripoll
2022-06-18 21:13:32 +02:00
committed by GitHub
parent 51249ebcfc
commit d3cec6d67e
9 changed files with 128 additions and 105 deletions
+3
View File
@@ -36,6 +36,9 @@ arpack-ng - 3.9.0
* CMake: Handle libraries without "lib" prefix.
* CMake: Don't override BLAS/LAPACK/MPI flags. Directly use results from the Find* modules instead.
[ Juan José García-Ripoll ]
* Adapt the C/C++ interface to accept also MSVC's non-standard complex types.
-- Sylvestre Ledru <sylvestre@debian.org> Mon, 07 Dec 2020 11:37:40 +0100
arpack-ng - 3.8.0
+16 -16
View File
@@ -437,18 +437,18 @@ class arpackSolver {
a_int ldv, a_int * iparam, a_int * ipntr, complex<float> * workd, complex<float> * workl, a_int lworkl, float * & rwork,
a_int * info) {
if (!rwork) rwork = new float[nbCV];
cnaupd_c(ido, bMat, nbDim, which, nbEV, tol, reinterpret_cast<_Complex float*>(resid), nbCV,
reinterpret_cast<_Complex float*>(v), ldv, iparam, ipntr, reinterpret_cast<_Complex float*>(workd),
reinterpret_cast<_Complex float*>(workl), lworkl, rwork, info);
cnaupd_c(ido, bMat, nbDim, which, nbEV, tol, reinterpret_cast<a_fcomplex*>(resid), nbCV,
reinterpret_cast<a_fcomplex*>(v), ldv, iparam, ipntr, reinterpret_cast<a_fcomplex*>(workd),
reinterpret_cast<a_fcomplex*>(workl), lworkl, rwork, info);
};
void aupd(a_int * ido, char const * bMat, a_int nbDim, char const * which, complex<double> * resid, complex<double> * v,
a_int ldv, a_int * iparam, a_int * ipntr, complex<double> * workd, complex<double> * workl, a_int lworkl, double * & rwork,
a_int * info) {
if (!rwork) rwork = new double[nbCV];
znaupd_c(ido, bMat, nbDim, which, nbEV, tol, reinterpret_cast<_Complex double*>(resid), nbCV,
reinterpret_cast<_Complex double*>(v), ldv, iparam, ipntr, reinterpret_cast<_Complex double*>(workd),
reinterpret_cast<_Complex double*>(workl), lworkl, rwork, info);
znaupd_c(ido, bMat, nbDim, which, nbEV, tol, reinterpret_cast<a_dcomplex*>(resid), nbCV,
reinterpret_cast<a_dcomplex*>(v), ldv, iparam, ipntr, reinterpret_cast<a_dcomplex*>(workd),
reinterpret_cast<a_dcomplex*>(workl), lworkl, rwork, info);
};
void spectrum(RC * d, RC * z, a_int nbDim, a_int * iparam) {
@@ -589,11 +589,11 @@ class arpackSolver {
complex<float> * workev = new complex<float>[2*nbCV];
complex<float> sigma = complex<float>((float) sigmaReal, (float) sigmaImag);
cneupd_c(rvec, howmny, select, reinterpret_cast<_Complex float*>(d), reinterpret_cast<_Complex float*>(z), ldz,
reinterpret_cast<_Complex float &>(sigma), reinterpret_cast<_Complex float*>(workev),
bMat, nbDim, which, nbEV, tol, reinterpret_cast<_Complex float*>(resid), nbCV,
reinterpret_cast<_Complex float*>(v), ldv, iparam, ipntr,
reinterpret_cast<_Complex float*>(workd), reinterpret_cast<_Complex float*>(workl), lworkl, rwork, &info);
cneupd_c(rvec, howmny, select, reinterpret_cast<a_fcomplex*>(d), reinterpret_cast<a_fcomplex*>(z), ldz,
reinterpret_cast<a_fcomplex &>(sigma), reinterpret_cast<a_fcomplex*>(workev),
bMat, nbDim, which, nbEV, tol, reinterpret_cast<a_fcomplex*>(resid), nbCV,
reinterpret_cast<a_fcomplex*>(v), ldv, iparam, ipntr,
reinterpret_cast<a_fcomplex*>(workd), reinterpret_cast<a_fcomplex*>(workl), lworkl, rwork, &info);
if (info == -14) cerr << "Error: zneupd - KO: dsaupd did not find any eigenvalues to sufficient accuracy" << endl;
if (info < 0 && info != -14 /*-14: don't break*/) {cerr << "Error: zneupd - KO with info " << info << endl; return 1;}
@@ -613,11 +613,11 @@ class arpackSolver {
complex<double> * workev = new complex<double>[2*nbCV];
complex<double> sigma = complex<double>(sigmaReal, sigmaImag);
zneupd_c(rvec, howmny, select, reinterpret_cast<_Complex double*>(d), reinterpret_cast<_Complex double*>(z), ldz,
reinterpret_cast<_Complex double &>(sigma), reinterpret_cast<_Complex double*>(workev),
bMat, nbDim, which, nbEV, tol, reinterpret_cast<_Complex double*>(resid), nbCV,
reinterpret_cast<_Complex double*>(v), ldv, iparam, ipntr,
reinterpret_cast<_Complex double*>(workd), reinterpret_cast<_Complex double*>(workl), lworkl, rwork, &info);
zneupd_c(rvec, howmny, select, reinterpret_cast<a_dcomplex*>(d), reinterpret_cast<a_dcomplex*>(z), ldz,
reinterpret_cast<a_dcomplex &>(sigma), reinterpret_cast<a_dcomplex*>(workev),
bMat, nbDim, which, nbEV, tol, reinterpret_cast<a_dcomplex*>(resid), nbCV,
reinterpret_cast<a_dcomplex*>(v), ldv, iparam, ipntr,
reinterpret_cast<a_dcomplex*>(workd), reinterpret_cast<a_dcomplex*>(workl), lworkl, rwork, &info);
if (info == -14) cerr << "Error: zneupd - KO: dsaupd did not find any eigenvalues to sufficient accuracy" << endl;
if (info < 0 && info != -14 /*-14: don't break*/) {cerr << "Error: zneupd - KO with info " << info << endl; return 1;}
+4 -4
View File
@@ -7,8 +7,8 @@
extern "C" {
#endif
void cnaupd_c(a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, float tol, float _Complex* resid, a_int ncv, float _Complex* v, a_int ldv, a_int* iparam, a_int* ipntr, float _Complex* workd, float _Complex* workl, a_int lworkl, float* rwork, a_int* info);
void cneupd_c(a_int rvec, char const* howmny, a_int const* select, float _Complex* d, float _Complex* z, a_int ldz, float _Complex sigma, float _Complex* workev, char const* bmat, a_int n, char const* which, a_int nev, float tol, float _Complex* resid, a_int ncv, float _Complex* v, a_int ldv, a_int* iparam, a_int* ipntr, float _Complex* workd, float _Complex* workl, a_int lworkl, float* rwork, a_int* info);
void cnaupd_c(a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, float tol, a_fcomplex* resid, a_int ncv, a_fcomplex* v, a_int ldv, a_int* iparam, a_int* ipntr, a_fcomplex* workd, a_fcomplex* workl, a_int lworkl, float* rwork, a_int* info);
void cneupd_c(a_int rvec, char const* howmny, a_int const* select, a_fcomplex* d, a_fcomplex* z, a_int ldz, a_fcomplex sigma, a_fcomplex* workev, char const* bmat, a_int n, char const* which, a_int nev, float tol, a_fcomplex* resid, a_int ncv, a_fcomplex* v, a_int ldv, a_int* iparam, a_int* ipntr, a_fcomplex* workd, a_fcomplex* workl, a_int lworkl, float* rwork, a_int* info);
void dnaupd_c(a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, double tol, double* resid, a_int ncv, double* v, a_int ldv, a_int* iparam, a_int* ipntr, double* workd, double* workl, a_int lworkl, a_int* info);
void dneupd_c(a_int rvec, char const* howmny, a_int const* select, double* dr, double* di, double* z, a_int ldz, double sigmar, double sigmai, double * workev, char const* bmat, a_int n, char const* which, a_int nev, double tol, double* resid, a_int ncv, double* v, a_int ldv, a_int* iparam, a_int* ipntr, double* workd, double* workl, a_int lworkl, a_int* info);
void dsaupd_c(a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, double tol, double* resid, a_int ncv, double* v, a_int ldv, a_int* iparam, a_int* ipntr, double* workd, double* workl, a_int lworkl, a_int* info);
@@ -17,8 +17,8 @@ void snaupd_c(a_int* ido, char const* bmat, a_int n, char const* which, a_int ne
void sneupd_c(a_int rvec, char const* howmny, a_int const* select, float* dr, float* di, float* z, a_int ldz, float sigmar, float sigmai, float * workev, char const* bmat, a_int n, char const* which, a_int nev, float tol, float* resid, a_int ncv, float* v, a_int ldv, a_int* iparam, a_int* ipntr, float* workd, float* workl, a_int lworkl, a_int* info);
void ssaupd_c(a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, float tol, float* resid, a_int ncv, float* v, a_int ldv, a_int* iparam, a_int* ipntr, float* workd, float* workl, a_int lworkl, a_int* info);
void sseupd_c(a_int rvec, char const* howmny, a_int const* select, float* d, float* z, a_int ldz, float sigma, char const* bmat, a_int n, char const* which, a_int nev, float tol, float* resid, a_int ncv, float* v, a_int ldv, a_int* iparam, a_int* ipntr, float* workd, float* workl, a_int lworkl, a_int* info);
void znaupd_c(a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, double tol, double _Complex* resid, a_int ncv, double _Complex* v, a_int ldv, a_int* iparam, a_int* ipntr, double _Complex* workd, double _Complex* workl, a_int lworkl, double* rwork, a_int* info);
void zneupd_c(a_int rvec, char const* howmny, a_int const* select, double _Complex* d, double _Complex* z, a_int ldz, double _Complex sigma, double _Complex* workev, char const* bmat, a_int n, char const* which, a_int nev, double tol, double _Complex* resid, a_int ncv, double _Complex* v, a_int ldv, a_int* iparam, a_int* ipntr, double _Complex* workd, double _Complex* workl, a_int lworkl, double* rwork, a_int* info);
void znaupd_c(a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, double tol, a_dcomplex* resid, a_int ncv, a_dcomplex* v, a_int ldv, a_int* iparam, a_int* ipntr, a_dcomplex* workd, a_dcomplex* workl, a_int lworkl, double* rwork, a_int* info);
void zneupd_c(a_int rvec, char const* howmny, a_int const* select, a_dcomplex* d, a_dcomplex* z, a_int ldz, a_dcomplex sigma, a_dcomplex* workev, char const* bmat, a_int n, char const* which, a_int nev, double tol, a_dcomplex* resid, a_int ncv, a_dcomplex* v, a_int ldv, a_int* iparam, a_int* ipntr, a_dcomplex* workd, a_dcomplex* workl, a_int lworkl, double* rwork, a_int* info);
#ifdef __cplusplus
}
+24 -24
View File
@@ -186,10 +186,10 @@ inline void naupd(a_int& ido, bmat const bmat_option, a_int n,
float* rwork, a_int& info) {
internal::cnaupd_c(&ido, internal::convert_to_char(bmat_option), n,
internal::convert_to_char(ritz_option), nev, tol,
reinterpret_cast<_Complex float*>(resid), ncv,
reinterpret_cast<_Complex float*>(v), ldv, iparam, ipntr,
reinterpret_cast<_Complex float*>(workd),
reinterpret_cast<_Complex float*>(workl), lworkl,
reinterpret_cast<a_fcomplex*>(resid), ncv,
reinterpret_cast<a_fcomplex*>(v), ldv, iparam, ipntr,
reinterpret_cast<a_fcomplex*>(workd),
reinterpret_cast<a_fcomplex*>(workl), lworkl,
rwork, &info);
}
@@ -203,16 +203,16 @@ inline void neupd(a_int rvec, howmny const howmny_option, a_int* select,
a_int lworkl, float* rwork, a_int& info) {
std::complex<float> sigma2 = sigma;
internal::cneupd_c(rvec, internal::convert_to_char(howmny_option), select,
reinterpret_cast<_Complex float*>(d),
reinterpret_cast<_Complex float*>(z), ldz,
*reinterpret_cast<_Complex float*>(&sigma2),
reinterpret_cast<_Complex float*>(workev),
reinterpret_cast<a_fcomplex*>(d),
reinterpret_cast<a_fcomplex*>(z), ldz,
*reinterpret_cast<a_fcomplex*>(&sigma2),
reinterpret_cast<a_fcomplex*>(workev),
internal::convert_to_char(bmat_option), n,
internal::convert_to_char(ritz_option), nev, tol,
reinterpret_cast<_Complex float*>(resid), ncv,
reinterpret_cast<_Complex float*>(v), ldv, iparam, ipntr,
reinterpret_cast<_Complex float*>(workd),
reinterpret_cast<_Complex float*>(workl), lworkl,
reinterpret_cast<a_fcomplex*>(resid), ncv,
reinterpret_cast<a_fcomplex*>(v), ldv, iparam, ipntr,
reinterpret_cast<a_fcomplex*>(workd),
reinterpret_cast<a_fcomplex*>(workl), lworkl,
rwork, &info);
}
@@ -224,10 +224,10 @@ inline void naupd(a_int& ido, bmat const bmat_option, a_int n,
double* rwork, a_int& info) {
internal::znaupd_c(&ido, internal::convert_to_char(bmat_option), n,
internal::convert_to_char(ritz_option), nev, tol,
reinterpret_cast<_Complex double*>(resid), ncv,
reinterpret_cast<_Complex double*>(v), ldv, iparam, ipntr,
reinterpret_cast<_Complex double*>(workd),
reinterpret_cast<_Complex double*>(workl), lworkl,
reinterpret_cast<a_dcomplex*>(resid), ncv,
reinterpret_cast<a_dcomplex*>(v), ldv, iparam, ipntr,
reinterpret_cast<a_dcomplex*>(workd),
reinterpret_cast<a_dcomplex*>(workl), lworkl,
rwork, &info);
}
@@ -241,16 +241,16 @@ inline void neupd(a_int rvec, howmny const howmny_option, a_int* select,
a_int lworkl, double* rwork, a_int& info) {
std::complex<double> sigma2 = sigma;
internal::zneupd_c(rvec, internal::convert_to_char(howmny_option), select,
reinterpret_cast<_Complex double*>(d),
reinterpret_cast<_Complex double*>(z), ldz,
*reinterpret_cast<_Complex double*>(&sigma2),
reinterpret_cast<_Complex double*>(workev),
reinterpret_cast<a_dcomplex*>(d),
reinterpret_cast<a_dcomplex*>(z), ldz,
*reinterpret_cast<a_dcomplex*>(&sigma2),
reinterpret_cast<a_dcomplex*>(workev),
internal::convert_to_char(bmat_option), n,
internal::convert_to_char(ritz_option), nev, tol,
reinterpret_cast<_Complex double*>(resid), ncv,
reinterpret_cast<_Complex double*>(v), ldv, iparam, ipntr,
reinterpret_cast<_Complex double*>(workd),
reinterpret_cast<_Complex double*>(workl), lworkl,
reinterpret_cast<a_dcomplex*>(resid), ncv,
reinterpret_cast<a_dcomplex*>(v), ldv, iparam, ipntr,
reinterpret_cast<a_dcomplex*>(workd),
reinterpret_cast<a_dcomplex*>(workl), lworkl,
rwork, &info);
}
} // namespace arpack
+4 -4
View File
@@ -14,8 +14,8 @@
extern "C" {
#endif
void pcnaupd_c(MPI_Fint comm, a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, float tol, float _Complex* resid, a_int ncv, float _Complex* v, a_int ldv, a_int* iparam, a_int* ipntr, float _Complex* workd, float _Complex* workl, a_int lworkl, float _Complex* rwork, a_int* info);
void pcneupd_c(MPI_Fint comm, a_int rvec, char const* howmny, a_int const* select, float _Complex* d, float _Complex* z, a_int ldz, float _Complex sigma, float _Complex* workev, char const* bmat, a_int n, char const* which, a_int nev, float tol, float _Complex* resid, a_int ncv, float _Complex* v, a_int ldv, a_int* iparam, a_int* ipntr, float _Complex* workd, float _Complex* workl, a_int lworkl, float _Complex* rwork, a_int* info);
void pcnaupd_c(MPI_Fint comm, a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, float tol, a_fcomplex* resid, a_int ncv, a_fcomplex* v, a_int ldv, a_int* iparam, a_int* ipntr, a_fcomplex* workd, a_fcomplex* workl, a_int lworkl, a_fcomplex* rwork, a_int* info);
void pcneupd_c(MPI_Fint comm, a_int rvec, char const* howmny, a_int const* select, a_fcomplex* d, a_fcomplex* z, a_int ldz, a_fcomplex sigma, a_fcomplex* workev, char const* bmat, a_int n, char const* which, a_int nev, float tol, a_fcomplex* resid, a_int ncv, a_fcomplex* v, a_int ldv, a_int* iparam, a_int* ipntr, a_fcomplex* workd, a_fcomplex* workl, a_int lworkl, a_fcomplex* rwork, a_int* info);
void pdnaupd_c(MPI_Fint comm, a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, double tol, double* resid, a_int ncv, double* v, a_int ldv, a_int* iparam, a_int* ipntr, double* workd, double* workl, a_int lworkl, a_int* info);
void pdneupd_c(MPI_Fint comm, a_int rvec, char const* howmny, a_int const* select, double* dr, double* di, double* z, a_int ldz, double sigmar, double sigmai, double * workev, char const* bmat, a_int n, char const* which, a_int nev, double tol, double* resid, a_int ncv, double* v, a_int ldv, a_int* iparam, a_int* ipntr, double* workd, double* workl, a_int lworkl, a_int* info);
void pdsaupd_c(MPI_Fint comm, a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, double tol, double* resid, a_int ncv, double* v, a_int ldv, a_int* iparam, a_int* ipntr, double* workd, double* workl, a_int lworkl, a_int* info);
@@ -24,8 +24,8 @@ void psnaupd_c(MPI_Fint comm, a_int* ido, char const* bmat, a_int n, char const*
void psneupd_c(MPI_Fint comm, a_int rvec, char const* howmny, a_int const* select, float* dr, float* di, float* z, a_int ldz, float sigmar, float sigmai, float * workev, char const* bmat, a_int n, char const* which, a_int nev, float tol, float* resid, a_int ncv, float* v, a_int ldv, a_int* iparam, a_int* ipntr, float* workd, float* workl, a_int lworkl, a_int* info);
void pssaupd_c(MPI_Fint comm, a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, float tol, float* resid, a_int ncv, float* v, a_int ldv, a_int* iparam, a_int* ipntr, float* workd, float* workl, a_int lworkl, a_int* info);
void psseupd_c(MPI_Fint comm, a_int rvec, char const* howmny, a_int const* select, float* d, float* z, a_int ldz, float sigma, char const* bmat, a_int n, char const* which, a_int nev, float tol, float* resid, a_int ncv, float* v, a_int ldv, a_int* iparam, a_int* ipntr, float* workd, float* workl, a_int lworkl, a_int* info);
void pznaupd_c(MPI_Fint comm, a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, double tol, double _Complex* resid, a_int ncv, double _Complex* v, a_int ldv, a_int* iparam, a_int* ipntr, double _Complex* workd, double _Complex* workl, a_int lworkl, double _Complex* rwork, a_int* info);
void pzneupd_c(MPI_Fint comm, a_int rvec, char const* howmny, a_int const* select, double _Complex* d, double _Complex* z, a_int ldz, double _Complex sigma, double _Complex* workev, char const* bmat, a_int n, char const* which, a_int nev, double tol, double _Complex* resid, a_int ncv, double _Complex* v, a_int ldv, a_int* iparam, a_int* ipntr, double _Complex* workd, double _Complex* workl, a_int lworkl, double _Complex* rwork, a_int* info);
void pznaupd_c(MPI_Fint comm, a_int* ido, char const* bmat, a_int n, char const* which, a_int nev, double tol, a_dcomplex* resid, a_int ncv, a_dcomplex* v, a_int ldv, a_int* iparam, a_int* ipntr, a_dcomplex* workd, a_dcomplex* workl, a_int lworkl, a_dcomplex* rwork, a_int* info);
void pzneupd_c(MPI_Fint comm, a_int rvec, char const* howmny, a_int const* select, a_dcomplex* d, a_dcomplex* z, a_int ldz, a_dcomplex sigma, a_dcomplex* workev, char const* bmat, a_int n, char const* which, a_int nev, double tol, a_dcomplex* resid, a_int ncv, a_dcomplex* v, a_int ldv, a_int* iparam, a_int* ipntr, a_dcomplex* workd, a_dcomplex* workl, a_int lworkl, a_dcomplex* rwork, a_int* info);
#ifdef __cplusplus
}
+28 -28
View File
@@ -114,11 +114,11 @@ inline void naupd(MPI_Fint comm, a_int& ido, bmat const bmat_option, a_int n,
std::complex<float>* rwork, a_int& info) {
internal::pcnaupd_c(comm, &ido, internal::convert_to_char(bmat_option), n,
internal::convert_to_char(which_option), nev, tol,
reinterpret_cast<_Complex float*>(resid), ncv,
reinterpret_cast<_Complex float*>(v), ldv, iparam, ipntr,
reinterpret_cast<_Complex float*>(workd),
reinterpret_cast<_Complex float*>(workl), lworkl,
reinterpret_cast<_Complex float*>(rwork), &info);
reinterpret_cast<a_fcomplex*>(resid), ncv,
reinterpret_cast<a_fcomplex*>(v), ldv, iparam, ipntr,
reinterpret_cast<a_fcomplex*>(workd),
reinterpret_cast<a_fcomplex*>(workl), lworkl,
reinterpret_cast<a_fcomplex*>(rwork), &info);
}
inline void neupd(MPI_Fint comm, a_int rvec, howmny const howmny_option,
@@ -134,17 +134,17 @@ inline void neupd(MPI_Fint comm, a_int rvec, howmny const howmny_option,
{
std::complex<float> sigma2 = sigma;
internal::pcneupd_c(comm, rvec, internal::convert_to_char(howmny_option),
select, reinterpret_cast<_Complex float*>(d),
reinterpret_cast<_Complex float*>(z), ldz,
*reinterpret_cast<_Complex float*>(&sigma2),
reinterpret_cast<_Complex float*>(workev),
select, reinterpret_cast<a_fcomplex*>(d),
reinterpret_cast<a_fcomplex*>(z), ldz,
*reinterpret_cast<a_fcomplex*>(&sigma2),
reinterpret_cast<a_fcomplex*>(workev),
internal::convert_to_char(bmat_option), n,
internal::convert_to_char(which_option), nev, tol,
reinterpret_cast<_Complex float*>(resid), ncv,
reinterpret_cast<_Complex float*>(v), ldv, iparam, ipntr,
reinterpret_cast<_Complex float*>(workd),
reinterpret_cast<_Complex float*>(workl), lworkl,
reinterpret_cast<_Complex float*>(rwork), &info);
reinterpret_cast<a_fcomplex*>(resid), ncv,
reinterpret_cast<a_fcomplex*>(v), ldv, iparam, ipntr,
reinterpret_cast<a_fcomplex*>(workd),
reinterpret_cast<a_fcomplex*>(workl), lworkl,
reinterpret_cast<a_fcomplex*>(rwork), &info);
}
inline void naupd(MPI_Fint comm, a_int& ido, bmat const bmat_option, a_int n,
@@ -155,11 +155,11 @@ inline void naupd(MPI_Fint comm, a_int& ido, bmat const bmat_option, a_int n,
std::complex<double>* rwork, a_int& info) {
internal::pznaupd_c(comm, &ido, internal::convert_to_char(bmat_option), n,
internal::convert_to_char(which_option), nev, tol,
reinterpret_cast<_Complex double*>(resid), ncv,
reinterpret_cast<_Complex double*>(v), ldv, iparam, ipntr,
reinterpret_cast<_Complex double*>(workd),
reinterpret_cast<_Complex double*>(workl), lworkl,
reinterpret_cast<_Complex double*>(rwork), &info);
reinterpret_cast<a_dcomplex*>(resid), ncv,
reinterpret_cast<a_dcomplex*>(v), ldv, iparam, ipntr,
reinterpret_cast<a_dcomplex*>(workd),
reinterpret_cast<a_dcomplex*>(workl), lworkl,
reinterpret_cast<a_dcomplex*>(rwork), &info);
}
inline void neupd(MPI_Fint comm, a_int rvec, howmny const howmny_option,
@@ -173,17 +173,17 @@ inline void neupd(MPI_Fint comm, a_int rvec, howmny const howmny_option,
std::complex<double>* rwork, a_int& info) {
std::complex<double> sigma2 = sigma;
internal::pzneupd_c(comm, rvec, internal::convert_to_char(howmny_option),
select, reinterpret_cast<_Complex double*>(d),
reinterpret_cast<_Complex double*>(z), ldz,
*reinterpret_cast<_Complex double*>(&sigma2),
reinterpret_cast<_Complex double*>(workev),
select, reinterpret_cast<a_dcomplex*>(d),
reinterpret_cast<a_dcomplex*>(z), ldz,
*reinterpret_cast<a_dcomplex*>(&sigma2),
reinterpret_cast<a_dcomplex*>(workev),
internal::convert_to_char(bmat_option), n,
internal::convert_to_char(which_option), nev, tol,
reinterpret_cast<_Complex double*>(resid), ncv,
reinterpret_cast<_Complex double*>(v), ldv, iparam, ipntr,
reinterpret_cast<_Complex double*>(workd),
reinterpret_cast<_Complex double*>(workl), lworkl,
reinterpret_cast<_Complex double*>(rwork), &info);
reinterpret_cast<a_dcomplex*>(resid), ncv,
reinterpret_cast<a_dcomplex*>(v), ldv, iparam, ipntr,
reinterpret_cast<a_dcomplex*>(workd),
reinterpret_cast<a_dcomplex*>(workl), lworkl,
reinterpret_cast<a_dcomplex*>(rwork), &info);
}
} // namespace arpack
#endif
+14 -14
View File
@@ -96,9 +96,9 @@ int ds() {
return 0;
}
void zMatVec(double _Complex* x, double _Complex* y) {
void zMatVec(a_dcomplex* x, a_dcomplex* y) {
int i;
for (i = 0; i < 1000; ++i) y[i] = x[i] * (i + 1.0 + _Complex_I * (i + 1.0));
for (i = 0; i < 1000; ++i) y[i] = x[i] * CMPLXF(i + 1.0, i + 1.0);
};
int zn() {
@@ -108,30 +108,30 @@ int zn() {
char which[] = "LM";
a_int nev = 1;
double tol = 0.000001; // small tol => more stable checks after EV computation.
double _Complex resid[N];
a_dcomplex resid[N];
a_int ncv = 2 * nev + 1;
double _Complex V[ncv * N];
a_dcomplex V[ncv * N];
a_int ldv = N;
a_int iparam[11];
a_int ipntr[14];
double _Complex workd[3 * N];
a_dcomplex workd[3 * N];
a_int rvec = 0;
char howmny[] = "A";
double _Complex* d =
(double _Complex*)malloc((nev + 1) * sizeof(double _Complex));
a_dcomplex* d =
(a_dcomplex*)malloc((nev + 1) * sizeof(a_dcomplex));
a_int select[ncv];
int i; // C99 compliant.
for (i = 0; i < ncv; i++) select[i] = 1;
double _Complex z[(N + 1) * (nev + 1)];
a_dcomplex z[(N + 1) * (nev + 1)];
a_int ldz = N + 1;
double _Complex sigma = 0. + I * 0.;
a_dcomplex sigma = CMPLX(0., 0.);
int k;
for (k = 0; k < 3 * N; ++k) workd[k] = 0. + I * 0.;
double _Complex workl[3 * (ncv * ncv) + 6 * ncv];
for (k = 0; k < 3 * (ncv * ncv) + 6 * ncv; ++k) workl[k] = 0. + I * 0.;
for (k = 0; k < 3 * N; ++k) workd[k] = CMPLX(0., 0.);
a_dcomplex workl[3 * (ncv * ncv) + 6 * ncv];
for (k = 0; k < 3 * (ncv * ncv) + 6 * ncv; ++k) workl[k] = CMPLX(0., 0.);
a_int lworkl = 3 * (ncv * ncv) + 6 * ncv;
double _Complex rwork[ncv];
double _Complex workev[2 * ncv];
a_dcomplex rwork[ncv];
a_dcomplex workev[2 * ncv];
a_int info = 0;
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+11 -11
View File
@@ -90,9 +90,9 @@ int ds() {
return 0;
}
void zMatVec(double _Complex* x, double _Complex* y) {
void zMatVec(a_dcomplex* x, a_dcomplex* y) {
int i;
for (i = 0; i < 1000; ++i) y[i] = x[i] * (i + 1.0 + _Complex_I * (i + 1.0));
for (i = 0; i < 1000; ++i) y[i] = x[i] * CMPLX(i + 1.0, i + 1.0);
};
int zn() {
@@ -102,30 +102,30 @@ int zn() {
char which[] = "LM";
a_int nev = 9;
double tol = 0.000001; // small tol => more stable checks after EV computation.
double _Complex resid[N];
a_dcomplex resid[N];
a_int ncv = 2 * nev + 1;
double _Complex V[ncv * N];
a_dcomplex V[ncv * N];
a_int ldv = N;
a_int iparam[11];
a_int ipntr[14];
double _Complex workd[3 * N];
a_dcomplex workd[3 * N];
a_int rvec = 0;
char howmny[] = "A";
double _Complex* d =
(double _Complex*)malloc((nev + 1) * sizeof(double _Complex));
a_dcomplex* d =
(a_dcomplex*)malloc((nev + 1) * sizeof(a_dcomplex));
a_int select[ncv];
int i; // C99 compliant.
for (i = 0; i < ncv; i++) select[i] = 1;
double _Complex z[(N + 1) * (nev + 1)];
a_dcomplex z[(N + 1) * (nev + 1)];
a_int ldz = N + 1;
double _Complex sigma = 0. + I * 0.;
a_dcomplex sigma = CMPLX(0., 0.);
int k;
for (k = 0; k < 3 * N; ++k) workd[k] = 0;
double _Complex workl[3 * (ncv * ncv) + 6 * ncv];
a_dcomplex workl[3 * (ncv * ncv) + 6 * ncv];
for (k = 0; k < 3 * (ncv * ncv) + 6 * ncv; ++k) workl[k] = 0;
a_int lworkl = 3 * (ncv * ncv) + 6 * ncv;
double rwork[ncv];
double _Complex workev[2 * ncv];
a_dcomplex workev[2 * ncv];
a_int info = 0;
iparam[0] = 1;
+24 -4
View File
@@ -7,11 +7,31 @@
#if INTERFACE64
#include <stdint.h> /* Include this header for int64_t, uint64_t definition. */
#define a_int int64_t
#define a_uint uint64_t
#define a_int int64_t
#define a_uint uint64_t
#else
#define a_int int
#define a_uint unsigned int
#define a_int int
#define a_uint unsigned int
#endif
#ifdef _MSC_VER
#include <complex.h>
#define a_fcomplex _Fcomplex
#define a_dcomplex _Dcomplex
#ifndef CMPLXF
#define CMPLXF(r,i) _FCbuild(r,i)
#endif
#ifndef CMPLX
#define CMPLX(r,i) _Cbuild(r,i)
#endif
#else
#ifndef CMPLXF
#define CMPLXF(r,i) ((float _Complex)((float)(r) + _Complex_I * (float)(i)))
#endif
#ifndef CMPLX
#define CMPLX(r,i) ((double _Complex)((double)(r) + _Complex_I * (double)(i)))
#endif
#define a_fcomplex float _Complex
#define a_dcomplex double _Complex
#endif
#endif