Closed
Description
Description
Consider the following MWE
program main
use stdlib_kinds, only: dp
use stdlib_linalg, only: svd
implicit none
integer, parameter :: m = 2, n = 1
! Sigular value decomposition of A.
real(kind=dp) :: A(n, n)
real(kind=dp) :: U(n, n), S(n), Vt(n, n)
! Random matrix.
call random_number(A)
! Call to stdlib.
call svd(A, S, U, Vt)
end program main
Using gfortran 13.2.0
, I get this run time error:
At line 75528 of file build/dependencies/stdlib/src/stdlib_linalg_lapack_d.F90
Fortran runtime error: Index '2' of dimension 1 of array 'a' above upper bound of 1
Error termination. Backtrace:
#0 0x5621220d2c4a in __stdlib_linalg_lapack_d_MOD_stdlib_dgesdd
at build/dependencies/stdlib/src/stdlib_linalg_lapack_d.F90:75528
#1 0x56212190442b in __stdlib_linalg_MOD_stdlib_linalg_svd_d
at build/dependencies/stdlib/src/stdlib_linalg_svd.f90:483
#2 0x5621218f77c1 in MAIN__
at app/main.f90:15
#3 0x5621218f780c in main
at app/main.f90:2
<ERROR> Execution for object " MWE_stdlib_lstsq " returned exit code 2
<ERROR> *cmd_run*:stopping due to failed executions
Expected Behaviour
Computing the SVD of a column vector is admittedly a contrived example but this piece of code is part of larger subroutine in LightKrylov
iteratively computing the SVD of large-scale matrices using Lanczos Bidiagonalization. Note that if a row vector is considered instead of a column vector, the MWE runs perfectly.
Pinging @perazz, @jalvesz, @jvdp1.
Version of stdlib
0.6.1
Platform and Architecture
Linux with Ubuntu 22.04
Additional Information
No response
Activity
jalvesz commentedon Jun 14, 2024
@loiseaujc I noticed that in your mwe you use only
n
to define the matrices. shouldn'tm
be the first dimension of every matrix? tried that here https://godbolt.org/z/vf6bxqezd and it worksloiseaujc commentedon Jun 14, 2024
Oups, my bad. I'll have to double check in
LightKrylov
then. I'll close this issue for the moment.loiseaujc commentedon Jun 14, 2024
Actually, if
m = 1
, andn = 1
, I still get an error.perazz commentedon Jun 14, 2024
Sorry all for the late reply, I'm abroad on business travel the whole week. The error apparently comes from a LAPACK limitation, as
a(2,1)
is always accessed: inDGESDD
,but it should not take place as the requirement is
LDA >= max(1,M)
. So, I will investigate what matrix option is being used for this edge case.EDIT: Yes: that code segment is called part of this branch:
so all provided matrix sizes are OK according to the inputs.
stdlib_dlaset
should return without doing anything because the inputn-1 == 0
, but of course the compiler's bound checking complains because we are referencing addressa(2,1)
, which does not exist. So it indeed looks like you've found an issue with LAPACK: not technically a bug, but rather a F77-style edge case that modern compilers complain about. We must check if any of the other options (I.e. the ‘reduced matrices’ one) allows to continue bypassing this errorloiseaujc commentedon Jun 14, 2024
Oh I see. I was using
gesvd
inLightKrylov
which doesn't seem to suffer from this issue. I'll switch tostdlib_svd
nonetheless and simply add aif (k > 1) call svd(A, S, U, Vt)
since in practice it is very unlikely that a Krylov method converges in a single itertion. No big deal. Closing this issue then.stdlib_svd
+ minor typo corrections. nekStab/LightKrylov#96perazz commentedon Jun 15, 2024
I think we need to fix this @loiseaujc,
svd
must work for all cases, including a 1-sized matrixstdlib_*laset
add array bound checks in presence of hardcoded input address #836