diff --git a/CHANGES b/CHANGES index fc6b7e8..4bc982f 100644 --- a/CHANGES +++ b/CHANGES @@ -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 Mon, 07 Dec 2020 11:37:40 +0100 arpack-ng - 3.8.0 diff --git a/EXAMPLES/MATRIX_MARKET/arpackSolver.hpp b/EXAMPLES/MATRIX_MARKET/arpackSolver.hpp index dac9a08..3a596c8 100644 --- a/EXAMPLES/MATRIX_MARKET/arpackSolver.hpp +++ b/EXAMPLES/MATRIX_MARKET/arpackSolver.hpp @@ -437,18 +437,18 @@ class arpackSolver { a_int ldv, a_int * iparam, a_int * ipntr, complex * workd, complex * 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(resid), nbCV, + reinterpret_cast(v), ldv, iparam, ipntr, reinterpret_cast(workd), + reinterpret_cast(workl), lworkl, rwork, info); }; void aupd(a_int * ido, char const * bMat, a_int nbDim, char const * which, complex * resid, complex * v, a_int ldv, a_int * iparam, a_int * ipntr, complex * workd, complex * 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(resid), nbCV, + reinterpret_cast(v), ldv, iparam, ipntr, reinterpret_cast(workd), + reinterpret_cast(workl), lworkl, rwork, info); }; void spectrum(RC * d, RC * z, a_int nbDim, a_int * iparam) { @@ -589,11 +589,11 @@ class arpackSolver { complex * workev = new complex[2*nbCV]; complex sigma = complex((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(d), reinterpret_cast(z), ldz, + reinterpret_cast(sigma), reinterpret_cast(workev), + bMat, nbDim, which, nbEV, tol, reinterpret_cast(resid), nbCV, + reinterpret_cast(v), ldv, iparam, ipntr, + reinterpret_cast(workd), reinterpret_cast(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 * workev = new complex[2*nbCV]; complex sigma = complex(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(d), reinterpret_cast(z), ldz, + reinterpret_cast(sigma), reinterpret_cast(workev), + bMat, nbDim, which, nbEV, tol, reinterpret_cast(resid), nbCV, + reinterpret_cast(v), ldv, iparam, ipntr, + reinterpret_cast(workd), reinterpret_cast(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;} diff --git a/ICB/arpack.h b/ICB/arpack.h index 865e269..f9f1053 100644 --- a/ICB/arpack.h +++ b/ICB/arpack.h @@ -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 } diff --git a/ICB/arpack.hpp b/ICB/arpack.hpp index 4d753d1..7e16cee 100644 --- a/ICB/arpack.hpp +++ b/ICB/arpack.hpp @@ -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(resid), ncv, + reinterpret_cast(v), ldv, iparam, ipntr, + reinterpret_cast(workd), + reinterpret_cast(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 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(d), + reinterpret_cast(z), ldz, + *reinterpret_cast(&sigma2), + reinterpret_cast(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(resid), ncv, + reinterpret_cast(v), ldv, iparam, ipntr, + reinterpret_cast(workd), + reinterpret_cast(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(resid), ncv, + reinterpret_cast(v), ldv, iparam, ipntr, + reinterpret_cast(workd), + reinterpret_cast(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 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(d), + reinterpret_cast(z), ldz, + *reinterpret_cast(&sigma2), + reinterpret_cast(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(resid), ncv, + reinterpret_cast(v), ldv, iparam, ipntr, + reinterpret_cast(workd), + reinterpret_cast(workl), lworkl, rwork, &info); } } // namespace arpack diff --git a/ICB/parpack.h b/ICB/parpack.h index 23b14ee..29eacc0 100644 --- a/ICB/parpack.h +++ b/ICB/parpack.h @@ -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 } diff --git a/ICB/parpack.hpp b/ICB/parpack.hpp index aa9360d..b26aaaa 100644 --- a/ICB/parpack.hpp +++ b/ICB/parpack.hpp @@ -114,11 +114,11 @@ inline void naupd(MPI_Fint comm, a_int& ido, bmat const bmat_option, a_int n, std::complex* 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(resid), ncv, + reinterpret_cast(v), ldv, iparam, ipntr, + reinterpret_cast(workd), + reinterpret_cast(workl), lworkl, + reinterpret_cast(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 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(d), + reinterpret_cast(z), ldz, + *reinterpret_cast(&sigma2), + reinterpret_cast(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(resid), ncv, + reinterpret_cast(v), ldv, iparam, ipntr, + reinterpret_cast(workd), + reinterpret_cast(workl), lworkl, + reinterpret_cast(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* 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(resid), ncv, + reinterpret_cast(v), ldv, iparam, ipntr, + reinterpret_cast(workd), + reinterpret_cast(workl), lworkl, + reinterpret_cast(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* rwork, a_int& info) { std::complex 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(d), + reinterpret_cast(z), ldz, + *reinterpret_cast(&sigma2), + reinterpret_cast(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(resid), ncv, + reinterpret_cast(v), ldv, iparam, ipntr, + reinterpret_cast(workd), + reinterpret_cast(workl), lworkl, + reinterpret_cast(rwork), &info); } } // namespace arpack #endif diff --git a/PARPACK/TESTS/MPI/icb_parpack_c.c b/PARPACK/TESTS/MPI/icb_parpack_c.c index 91cb839..ef0058d 100644 --- a/PARPACK/TESTS/MPI/icb_parpack_c.c +++ b/PARPACK/TESTS/MPI/icb_parpack_c.c @@ -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); diff --git a/TESTS/icb_arpack_c.c b/TESTS/icb_arpack_c.c index 2140242..3abb41b 100644 --- a/TESTS/icb_arpack_c.c +++ b/TESTS/icb_arpack_c.c @@ -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; diff --git a/arpackdef.h.in b/arpackdef.h.in index d9e0143..dc939e2 100644 --- a/arpackdef.h.in +++ b/arpackdef.h.in @@ -7,11 +7,31 @@ #if INTERFACE64 #include /* 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 +#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