[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:
committed by
Sylvestre Ledru
parent
95360d81d6
commit
703fb580a4
@@ -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).
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user