### LAPACKE interface to ?ORCSD is not fully functional

Posted:

**Wed Jul 08, 2015 11:53 pm**?ORCSD subroutine has the following interface

?ORCSD (JOBU1, JOBU2, JOBV1T, JOBV2T, TRANS, SIGNS, M, P, Q, X11, LDX11, X12, LDX12, X21, LDX21, X22, LDX22, THETA, U1, LDU1, U2, LDU2, V1T, LDV1T, V2T, LDV2T, WORK, LWORK, IWORK, INFO)

and it uses array WORK to store output parameters if computations failed:

work(2:r) contains the values phi(1), ..., phi(r-1) that, together with theta(1), ...,theta(r) define the matrix in intermediate

bidiagonal-block form remaining after nonconvergence.

LAPACKE interface LAPACKE_dorcsd omits WORK array:

lapack_int LAPACKE_dorcsd( int matrix_order, char jobu1, char jobu2,

char jobv1t, char jobv2t, char trans, char signs,

lapack_int m, lapack_int p, lapack_int q,

double* x11, lapack_int ldx11, double* x12,

lapack_int ldx12, double* x21, lapack_int ldx21,

double* x22, lapack_int ldx22, double* theta,

double* u1, lapack_int ldu1, double* u2,

lapack_int ldu2, double* v1t, lapack_int ldv1t,

double* v2t, lapack_int ldv2t )

So, there is no way to provide the info as it is done via Fortran interface

Similar problem for ?UNCSD which returns unconverged values in the array rwork which also missed in the interface LAPACKE_?uncsd

?ORCSD (JOBU1, JOBU2, JOBV1T, JOBV2T, TRANS, SIGNS, M, P, Q, X11, LDX11, X12, LDX12, X21, LDX21, X22, LDX22, THETA, U1, LDU1, U2, LDU2, V1T, LDV1T, V2T, LDV2T, WORK, LWORK, IWORK, INFO)

and it uses array WORK to store output parameters if computations failed:

work(2:r) contains the values phi(1), ..., phi(r-1) that, together with theta(1), ...,theta(r) define the matrix in intermediate

bidiagonal-block form remaining after nonconvergence.

LAPACKE interface LAPACKE_dorcsd omits WORK array:

lapack_int LAPACKE_dorcsd( int matrix_order, char jobu1, char jobu2,

char jobv1t, char jobv2t, char trans, char signs,

lapack_int m, lapack_int p, lapack_int q,

double* x11, lapack_int ldx11, double* x12,

lapack_int ldx12, double* x21, lapack_int ldx21,

double* x22, lapack_int ldx22, double* theta,

double* u1, lapack_int ldu1, double* u2,

lapack_int ldu2, double* v1t, lapack_int ldv1t,

double* v2t, lapack_int ldv2t )

So, there is no way to provide the info as it is done via Fortran interface

Similar problem for ?UNCSD which returns unconverged values in the array rwork which also missed in the interface LAPACKE_?uncsd