[BUG FIX] ICB: missing workev for *[ds]neupd (real+not-sym). (#155)

Even with real matrices, eigen values can be complex if matrices
are not symmetric. In this case, you need workev.

ICB tests: should be OK as it turns out that they do NOT use
real+not-sym methods (they use real+sym and complex+non-sym).
This commit is contained in:
Franck HOUSSEN
2018-11-10 09:26:27 +01:00
committed by Sylvestre Ledru
parent 95360d81d6
commit 703fb580a4
9 changed files with 30 additions and 21 deletions
+1
View File
@@ -2,6 +2,7 @@ arpack-ng - 3.6.3
[ Franck Houssen ]
* Add Fortran common initialization (block data).
* [BUG FIX] ICB: missing workev for *[ds]neupd (real+not-sym) => API/ABI change for *[ds]neupd_c.
[ Marco Caliari ]
* Give up forcing the initial residual to be in the range of the operator OP after a restart (Closes: #142).
+3 -2
View File
@@ -27,7 +27,7 @@ subroutine pdnaupd_c(comm, ido, bmat, n, which, nev, tol, resid, ncv, v, ldv,&
end subroutine pdnaupd_c
subroutine pdneupd_c(comm, rvec, howmny, select, &
dr, di, z, ldz, sigmar, sigmai, &
dr, di, z, ldz, sigmar, sigmai, workev, &
bmat, n, which, nev, tol, resid, ncv, v, ldv,&
iparam, ipntr, workd, workl, lworkl, info) &
bind(c, name="pdneupd_c")
@@ -43,6 +43,7 @@ subroutine pdneupd_c(comm, rvec, howmny, select, &
integer(kind=c_int), value, intent(in) :: ldz
real(kind=c_double), value, intent(in) :: sigmar
real(kind=c_double), value, intent(in) :: sigmai
real(kind=c_double), dimension(3*ncv), intent(out) :: workev
character(kind=c_char), dimension(1), intent(in) :: bmat
integer(kind=c_int), value, intent(in) :: n
character(kind=c_char), dimension(2), intent(in) :: which
@@ -59,7 +60,7 @@ subroutine pdneupd_c(comm, rvec, howmny, select, &
integer(kind=c_int), value, intent(in) :: lworkl
integer(kind=c_int), intent(inout) :: info
call pdneupd(comm, rvec, howmny, select, &
dr, di, z, ldz, sigmar, sigmai, &
dr, di, z, ldz, sigmar, sigmai, workev, &
bmat, n, which, nev, tol, resid, ncv, v, ldv,&
iparam, ipntr, workd, workl, lworkl, info)
end subroutine pdneupd_c
+3 -2
View File
@@ -27,7 +27,7 @@ subroutine psnaupd_c(comm, ido, bmat, n, which, nev, tol, resid, ncv, v, ldv,&
end subroutine psnaupd_c
subroutine psneupd_c(comm, rvec, howmny, select, &
dr, di, z, ldz, sigmar, sigmai, &
dr, di, z, ldz, sigmar, sigmai, workev, &
bmat, n, which, nev, tol, resid, ncv, v, ldv,&
iparam, ipntr, workd, workl, lworkl, info) &
bind(c, name="psneupd_c")
@@ -43,6 +43,7 @@ subroutine psneupd_c(comm, rvec, howmny, select, &
integer(kind=c_int), value, intent(in) :: ldz
real(kind=c_float), value, intent(in) :: sigmar
real(kind=c_float), value, intent(in) :: sigmai
real(kind=c_float), dimension(3*ncv), intent(out) :: workev
character(kind=c_char), dimension(1), intent(in) :: bmat
integer(kind=c_int), value, intent(in) :: n
character(kind=c_char), dimension(2), intent(in) :: which
@@ -59,7 +60,7 @@ subroutine psneupd_c(comm, rvec, howmny, select, &
integer(kind=c_int), value, intent(in) :: lworkl
integer(kind=c_int), intent(inout) :: info
call psneupd(comm, rvec, howmny, select, &
dr, di, z, ldz, sigmar, sigmai, &
dr, di, z, ldz, sigmar, sigmai, workev, &
bmat, n, which, nev, tol, resid, ncv, v, ldv,&
iparam, ipntr, workd, workl, lworkl, info)
end subroutine psneupd_c
+3 -2
View File
@@ -26,7 +26,7 @@ subroutine dnaupd_c(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv,&
end subroutine dnaupd_c
subroutine dneupd_c(rvec, howmny, select, &
dr, di, z, ldz, sigmar, sigmai, &
dr, di, z, ldz, sigmar, sigmai, workev, &
bmat, n, which, nev, tol, resid, ncv, v, ldv,&
iparam, ipntr, workd, workl, lworkl, info) &
bind(c, name="dneupd_c")
@@ -41,6 +41,7 @@ subroutine dneupd_c(rvec, howmny, select, &
integer(kind=c_int), value, intent(in) :: ldz
real(kind=c_double), value, intent(in) :: sigmar
real(kind=c_double), value, intent(in) :: sigmai
real(kind=c_double), dimension(3*ncv), intent(out) :: workev
character(kind=c_char), dimension(1), intent(in) :: bmat
integer(kind=c_int), value, intent(in) :: n
character(kind=c_char), dimension(2), intent(in) :: which
@@ -57,7 +58,7 @@ subroutine dneupd_c(rvec, howmny, select, &
integer(kind=c_int), value, intent(in) :: lworkl
integer(kind=c_int), intent(inout) :: info
call dneupd(rvec, howmny, select, &
dr, di, z, ldz, sigmar, sigmai, &
dr, di, z, ldz, sigmar, sigmai, workev, &
bmat, n, which, nev, tol, resid, ncv, v, ldv,&
iparam, ipntr, workd, workl, lworkl, info)
end subroutine dneupd_c
+3 -2
View File
@@ -26,7 +26,7 @@ subroutine snaupd_c(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv,&
end subroutine snaupd_c
subroutine sneupd_c(rvec, howmny, select, &
dr, di, z, ldz, sigmar, sigmai, &
dr, di, z, ldz, sigmar, sigmai, workev, &
bmat, n, which, nev, tol, resid, ncv, v, ldv,&
iparam, ipntr, workd, workl, lworkl, info) &
bind(c, name="sneupd_c")
@@ -41,6 +41,7 @@ subroutine sneupd_c(rvec, howmny, select, &
integer(kind=c_int), value, intent(in) :: ldz
real(kind=c_float), value, intent(in) :: sigmar
real(kind=c_float), value, intent(in) :: sigmai
real(kind=c_float), dimension(3*ncv), intent(out) :: workev
character(kind=c_char), dimension(1), intent(in) :: bmat
integer(kind=c_int), value, intent(in) :: n
character(kind=c_char), dimension(2), intent(in) :: which
@@ -57,7 +58,7 @@ subroutine sneupd_c(rvec, howmny, select, &
integer(kind=c_int), value, intent(in) :: lworkl
integer(kind=c_int), intent(inout) :: info
call sneupd(rvec, howmny, select, &
dr, di, z, ldz, sigmar, sigmai, &
dr, di, z, ldz, sigmar, sigmai, workev, &
bmat, n, which, nev, tol, resid, ncv, v, ldv,&
iparam, ipntr, workd, workl, lworkl, info)
end subroutine sneupd_c
+2 -2
View File
@@ -8,11 +8,11 @@ extern "C" {
void cnaupd_c(int* ido, char const* bmat, int n, char const* which, int nev, float tol, float _Complex* resid, int ncv, float _Complex* v, int ldv, int* iparam, int* ipntr, float _Complex* workd, float _Complex* workl, int lworkl, float* rwork, int* info);
void cneupd_c(bool rvec, char const* howmny, int const* select, float _Complex* d, float _Complex* z, int ldz, float _Complex sigma, float _Complex* workev, char const* bmat, int n, char const* which, int nev, float tol, float _Complex* resid, int ncv, float _Complex* v, int ldv, int* iparam, int* ipntr, float _Complex* workd, float _Complex* workl, int lworkl, float* rwork, int* info);
void dnaupd_c(int* ido, char const* bmat, int n, char const* which, int nev, double tol, double* resid, int ncv, double* v, int ldv, int* iparam, int* ipntr, double* workd, double* workl, int lworkl, int* info);
void dneupd_c(bool rvec, char const* howmny, int const* select, double* dr, double* di, double* z, int ldz, double sigmar, double sigmai, char const* bmat, int n, char const* which, int nev, double tol, double* resid, int ncv, double* v, int ldv, int* iparam, int* ipntr, double* workd, double* workl, int lworkl, int* info);
void dneupd_c(bool rvec, char const* howmny, int const* select, double* dr, double* di, double* z, int ldz, double sigmar, double sigmai, double * workev, char const* bmat, int n, char const* which, int nev, double tol, double* resid, int ncv, double* v, int ldv, int* iparam, int* ipntr, double* workd, double* workl, int lworkl, int* info);
void dsaupd_c(int* ido, char const* bmat, int n, char const* which, int nev, double tol, double* resid, int ncv, double* v, int ldv, int* iparam, int* ipntr, double* workd, double* workl, int lworkl, int* info);
void dseupd_c(bool rvec, char const* howmny, int const* select, double* d, double* z, int ldz, double sigma, char const* bmat, int n, char const* which, int nev, double tol, double* resid, int ncv, double* v, int ldv, int* iparam, int* ipntr, double* workd, double* workl, int lworkl, int* info);
void snaupd_c(int* ido, char const* bmat, int n, char const* which, int nev, float tol, float* resid, int ncv, float* v, int ldv, int* iparam, int* ipntr, float* workd, float* workl, int lworkl, int* info);
void sneupd_c(bool rvec, char const* howmny, int const* select, float* dr, float* di, float* z, int ldz, float sigmar, float sigmai, char const* bmat, int n, char const* which, int nev, float tol, float* resid, int ncv, float* v, int ldv, int* iparam, int* ipntr, float* workd, float* workl, int lworkl, int* info);
void sneupd_c(bool rvec, char const* howmny, int const* select, float* dr, float* di, float* z, int ldz, float sigmar, float sigmai, float * workev, char const* bmat, int n, char const* which, int nev, float tol, float* resid, int ncv, float* v, int ldv, int* iparam, int* ipntr, float* workd, float* workl, int lworkl, int* info);
void ssaupd_c(int* ido, char const* bmat, int n, char const* which, int nev, float tol, float* resid, int ncv, float* v, int ldv, int* iparam, int* ipntr, float* workd, float* workl, int lworkl, int* info);
void sseupd_c(bool rvec, char const* howmny, int const* select, float* d, float* z, int ldz, float sigma, char const* bmat, int n, char const* which, int nev, float tol, float* resid, int ncv, float* v, int ldv, int* iparam, int* ipntr, float* workd, float* workl, int lworkl, int* info);
void znaupd_c(int* ido, char const* bmat, int n, char const* which, int nev, double tol, double _Complex* resid, int ncv, double _Complex* v, int ldv, int* iparam, int* ipntr, double _Complex* workd, double _Complex* workl, int lworkl, double* rwork, int* info);
+7 -5
View File
@@ -140,13 +140,14 @@ inline void naupd(int& ido, bmat const bmat_option, int n,
}
inline void neupd(bool rvec, howmny const howmny_option, int* select, float* dr,
float* di, float* z, int ldz, float sigmar, float sigmai,
float* di, float* z, int ldz,
float sigmar, float sigmai, float * workev,
bmat const bmat_option, int n, which const ritz_option,
int nev, float tol, float* resid, int ncv, float* v, int ldv,
int* iparam, int* ipntr, float* workd, float* workl,
int lworkl, int& info) {
internal::sneupd_c(rvec, internal::convert_to_char(howmny_option), select, dr,
di, z, ldz, sigmar, sigmai,
di, z, ldz, sigmar, sigmai, workev,
internal::convert_to_char(bmat_option), n,
internal::convert_to_char(ritz_option), nev, tol, resid,
ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, &info);
@@ -162,13 +163,14 @@ inline void naupd(int& ido, bmat const bmat_option, int n,
}
inline void neupd(bool rvec, howmny const howmny_option, int* select,
double* dr, double* di, double* z, int ldz, double sigmar,
double sigmai, bmat const bmat_option, int n,
double* dr, double* di, double* z, int ldz,
double sigmar, double sigmai, double * workev,
bmat const bmat_option, int n,
which const ritz_option, int nev, double tol, double* resid,
int ncv, double* v, int ldv, int* iparam, int* ipntr,
double* workd, double* workl, int lworkl, int& info) {
internal::dneupd_c(rvec, internal::convert_to_char(howmny_option), select, dr,
di, z, ldz, sigmar, sigmai,
di, z, ldz, sigmar, sigmai, workev,
internal::convert_to_char(bmat_option), n,
internal::convert_to_char(ritz_option), nev, tol, resid,
ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, &info);
+2 -2
View File
@@ -15,11 +15,11 @@ extern "C" {
void pcnaupd_c(MPI_Fint comm, int* ido, char const* bmat, int n, char const* which, int nev, float tol, float _Complex* resid, int ncv, float _Complex* v, int ldv, int* iparam, int* ipntr, float _Complex* workd, float _Complex* workl, int lworkl, float _Complex* rwork, int* info);
void pcneupd_c(MPI_Fint comm, bool rvec, char const* howmny, int const* select, float _Complex* d, float _Complex* z, int ldz, float _Complex sigma, float _Complex* workev, char const* bmat, int n, char const* which, int nev, float tol, float _Complex* resid, int ncv, float _Complex* v, int ldv, int* iparam, int* ipntr, float _Complex* workd, float _Complex* workl, int lworkl, float _Complex* rwork, int* info);
void pdnaupd_c(MPI_Fint comm, int* ido, char const* bmat, int n, char const* which, int nev, double tol, double* resid, int ncv, double* v, int ldv, int* iparam, int* ipntr, double* workd, double* workl, int lworkl, int* info);
void pdneupd_c(MPI_Fint comm, bool rvec, char const* howmny, int const* select, double* dr, double* di, double* z, int ldz, double sigmar, double sigmai, char const* bmat, int n, char const* which, int nev, double tol, double* resid, int ncv, double* v, int ldv, int* iparam, int* ipntr, double* workd, double* workl, int lworkl, int* info);
void pdneupd_c(MPI_Fint comm, bool rvec, char const* howmny, int const* select, double* dr, double* di, double* z, int ldz, double sigmar, double sigmai, double * workev, char const* bmat, int n, char const* which, int nev, double tol, double* resid, int ncv, double* v, int ldv, int* iparam, int* ipntr, double* workd, double* workl, int lworkl, int* info);
void pdsaupd_c(MPI_Fint comm, int* ido, char const* bmat, int n, char const* which, int nev, double tol, double* resid, int ncv, double* v, int ldv, int* iparam, int* ipntr, double* workd, double* workl, int lworkl, int* info);
void pdseupd_c(MPI_Fint comm, bool rvec, char const* howmny, int const* select, double* d, double* z, int ldz, double sigma, char const* bmat, int n, char const* which, int nev, double tol, double* resid, int ncv, double* v, int ldv, int* iparam, int* ipntr, double* workd, double* workl, int lworkl, int* info);
void psnaupd_c(MPI_Fint comm, int* ido, char const* bmat, int n, char const* which, int nev, float tol, float* resid, int ncv, float* v, int ldv, int* iparam, int* ipntr, float* workd, float* workl, int lworkl, int* info);
void psneupd_c(MPI_Fint comm, bool rvec, char const* howmny, int const* select, float* dr, float* di, float* z, int ldz, float sigmar, float sigmai, char const* bmat, int n, char const* which, int nev, float tol, float* resid, int ncv, float* v, int ldv, int* iparam, int* ipntr, float* workd, float* workl, int lworkl, int* info);
void psneupd_c(MPI_Fint comm, bool rvec, char const* howmny, int const* select, float* dr, float* di, float* z, int ldz, float sigmar, float sigmai, float * workev, char const* bmat, int n, char const* which, int nev, float tol, float* resid, int ncv, float* v, int ldv, int* iparam, int* ipntr, float* workd, float* workl, int lworkl, int* info);
void pssaupd_c(MPI_Fint comm, int* ido, char const* bmat, int n, char const* which, int nev, float tol, float* resid, int ncv, float* v, int ldv, int* iparam, int* ipntr, float* workd, float* workl, int lworkl, int* info);
void psseupd_c(MPI_Fint comm, bool rvec, char const* howmny, int const* select, float* d, float* z, int ldz, float sigma, char const* bmat, int n, char const* which, int nev, float tol, float* resid, int ncv, float* v, int ldv, int* iparam, int* ipntr, float* workd, float* workl, int lworkl, int* info);
void pznaupd_c(MPI_Fint comm, int* ido, char const* bmat, int n, char const* which, int nev, double tol, double _Complex* resid, int ncv, double _Complex* v, int ldv, int* iparam, int* ipntr, double _Complex* workd, double _Complex* workl, int lworkl, double _Complex* rwork, int* info);
+6 -4
View File
@@ -70,12 +70,13 @@ inline void naupd(MPI_Fint comm, int& ido, bmat const bmat_option, int n,
inline void neupd(MPI_Fint comm, bool rvec, howmny const howmny_option,
int* select, float* dr, float* di, float* z, int ldz,
float sigmar, float sigmai, bmat const bmat_option, int n,
float sigmar, float sigmai, float * workev,
bmat const bmat_option, int n,
which const which_option, int nev, float tol, float* resid,
int ncv, float* v, int ldv, int* iparam, int* ipntr,
float* workd, float* workl, int lworkl, int& info) {
internal::psneupd_c(comm, rvec, internal::convert_to_char(howmny_option),
select, dr, di, z, ldz, sigmar, sigmai,
select, dr, di, z, ldz, sigmar, sigmai, workev,
internal::convert_to_char(bmat_option), n,
internal::convert_to_char(which_option), nev, tol, resid,
ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, &info);
@@ -92,12 +93,13 @@ inline void naupd(MPI_Fint comm, int& ido, bmat const bmat_option, int n,
inline void neupd(MPI_Fint comm, bool rvec, howmny const howmny_option,
int* select, double* dr, double* di, double* z, int ldz,
double sigmar, double sigmai, bmat const bmat_option, int n,
double sigmar, double sigmai, double * workev,
bmat const bmat_option, int n,
which const which_option, int nev, double tol, double* resid,
int ncv, double* v, int ldv, int* iparam, int* ipntr,
double* workd, double* workl, int lworkl, int& info) {
internal::pdneupd_c(comm, rvec, internal::convert_to_char(howmny_option),
select, dr, di, z, ldz, sigmar, sigmai,
select, dr, di, z, ldz, sigmar, sigmai, workev,
internal::convert_to_char(bmat_option), n,
internal::convert_to_char(which_option), nev, tol, resid,
ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, &info);