00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "lapacke.h"
00035 #include "lapacke_utils.h"
00036
00037 lapack_int LAPACKE_zgelsd( int matrix_order, lapack_int m, lapack_int n,
00038 lapack_int nrhs, lapack_complex_double* a,
00039 lapack_int lda, lapack_complex_double* b,
00040 lapack_int ldb, double* s, double rcond,
00041 lapack_int* rank )
00042 {
00043 lapack_int info = 0;
00044 lapack_int lwork = -1;
00045
00046 lapack_int liwork;
00047 lapack_int lrwork;
00048 lapack_int* iwork = NULL;
00049 double* rwork = NULL;
00050 lapack_complex_double* work = NULL;
00051 lapack_int iwork_query;
00052 double rwork_query;
00053 lapack_complex_double work_query;
00054 if( matrix_order != LAPACK_COL_MAJOR && matrix_order != LAPACK_ROW_MAJOR ) {
00055 LAPACKE_xerbla( "LAPACKE_zgelsd", -1 );
00056 return -1;
00057 }
00058 #ifndef LAPACK_DISABLE_NAN_CHECK
00059
00060 if( LAPACKE_zge_nancheck( matrix_order, m, n, a, lda ) ) {
00061 return -5;
00062 }
00063 if( LAPACKE_zge_nancheck( matrix_order, MAX(m,n), nrhs, b, ldb ) ) {
00064 return -7;
00065 }
00066 if( LAPACKE_d_nancheck( 1, &rcond, 1 ) ) {
00067 return -10;
00068 }
00069 #endif
00070
00071 info = LAPACKE_zgelsd_work( matrix_order, m, n, nrhs, a, lda, b, ldb, s,
00072 rcond, rank, &work_query, lwork, &rwork_query,
00073 &iwork_query );
00074 if( info != 0 ) {
00075 goto exit_level_0;
00076 }
00077 liwork = (lapack_int)iwork_query;
00078 lrwork = (lapack_int)rwork_query;
00079 lwork = LAPACK_Z2INT( work_query );
00080
00081 iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * liwork );
00082 if( iwork == NULL ) {
00083 info = LAPACK_WORK_MEMORY_ERROR;
00084 goto exit_level_0;
00085 }
00086 rwork = (double*)LAPACKE_malloc( sizeof(double) * lrwork );
00087 if( rwork == NULL ) {
00088 info = LAPACK_WORK_MEMORY_ERROR;
00089 goto exit_level_1;
00090 }
00091 work = (lapack_complex_double*)
00092 LAPACKE_malloc( sizeof(lapack_complex_double) * lwork );
00093 if( work == NULL ) {
00094 info = LAPACK_WORK_MEMORY_ERROR;
00095 goto exit_level_2;
00096 }
00097
00098 info = LAPACKE_zgelsd_work( matrix_order, m, n, nrhs, a, lda, b, ldb, s,
00099 rcond, rank, work, lwork, rwork, iwork );
00100
00101 LAPACKE_free( work );
00102 exit_level_2:
00103 LAPACKE_free( rwork );
00104 exit_level_1:
00105 LAPACKE_free( iwork );
00106 exit_level_0:
00107 if( info == LAPACK_WORK_MEMORY_ERROR ) {
00108 LAPACKE_xerbla( "LAPACKE_zgelsd", info );
00109 }
00110 return info;
00111 }