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_dgejsv( int matrix_order, char joba, char jobu, char jobv,
00038 char jobr, char jobt, char jobp, lapack_int m,
00039 lapack_int n, double* a, lapack_int lda, double* sva,
00040 double* u, lapack_int ldu, double* v, lapack_int ldv,
00041 double* stat, lapack_int* istat )
00042 {
00043 lapack_int info = 0;
00044 lapack_int lwork = (!( LAPACKE_lsame( jobu, 'u' ) ||
00045 LAPACKE_lsame( jobu, 'f' ) ||
00046 LAPACKE_lsame( jobv, 'v' ) ||
00047 LAPACKE_lsame( jobv, 'j' ) ||
00048 LAPACKE_lsame( joba, 'e' ) ||
00049 LAPACKE_lsame( joba, 'g' ) ) ? MAX3(7,4*n+1,2*m+n) :
00050 ( (!( LAPACKE_lsame( jobu, 'u' ) ||
00051 LAPACKE_lsame( jobu, 'f' ) ||
00052 LAPACKE_lsame( jobv, 'v' ) ||
00053 LAPACKE_lsame( jobv, 'j' ) ) &&
00054 ( LAPACKE_lsame( joba, 'e' ) ||
00055 LAPACKE_lsame( joba, 'g' ) ) ) ? MAX3(7,4*n+n*n,2*m+n) :
00056 ( ( LAPACKE_lsame( jobu, 'u' ) ||
00057 LAPACKE_lsame( jobu, 'f' ) ) &&
00058 (!( LAPACKE_lsame( jobv, 'v' ) ||
00059 LAPACKE_lsame( jobv, 'j' ) ) ) ? MAX(7,2*n+m) :
00060 ( ( LAPACKE_lsame( jobv, 'v' ) ||
00061 LAPACKE_lsame( jobv, 'j' ) ) &&
00062 (!( LAPACKE_lsame( jobu, 'u' ) ||
00063 LAPACKE_lsame( jobu, 'f' ) ) ) ? MAX(7,2*n+m) :
00064 ( ( LAPACKE_lsame( jobu, 'u' ) ||
00065 LAPACKE_lsame( jobu, 'f' ) ) &&
00066 ( LAPACKE_lsame( jobv, 'v' ) ||
00067 LAPACKE_lsame( jobv, 'j' ) ) &&
00068 !LAPACKE_lsame( jobv, 'j' ) ? MAX(1,6*n+2*n*n) :
00069 ( ( LAPACKE_lsame( jobu, 'u' ) ||
00070 LAPACKE_lsame( jobu, 'f' ) ) &&
00071 ( LAPACKE_lsame( jobv, 'v' ) ||
00072 LAPACKE_lsame( jobv, 'j' ) ) &&
00073 LAPACKE_lsame( jobv, 'j' ) ? MAX(7,m+3*n+n*n) :
00074 1) ) ) ) ) );
00075 lapack_int* iwork = NULL;
00076 double* work = NULL;
00077 lapack_int i;
00078 if( matrix_order != LAPACK_COL_MAJOR && matrix_order != LAPACK_ROW_MAJOR ) {
00079 LAPACKE_xerbla( "LAPACKE_dgejsv", -1 );
00080 return -1;
00081 }
00082 #ifndef LAPACK_DISABLE_NAN_CHECK
00083
00084 lapack_int nu = LAPACKE_lsame( jobu, 'n' ) ? 1 : m;
00085 lapack_int nv = LAPACKE_lsame( jobv, 'n' ) ? 1 : n;
00086 if( LAPACKE_dge_nancheck( matrix_order, m, n, a, lda ) ) {
00087 return -10;
00088 }
00089 if( LAPACKE_lsame( jobu, 'f' ) || LAPACKE_lsame( jobu, 'u' ) ||
00090 LAPACKE_lsame( jobu, 'w' ) ) {
00091 if( LAPACKE_dge_nancheck( matrix_order, nu, n, u, ldu ) ) {
00092 return -13;
00093 }
00094 }
00095 if( LAPACKE_lsame( jobv, 'j' ) || LAPACKE_lsame( jobv, 'v' ) ||
00096 LAPACKE_lsame( jobv, 'w' ) ) {
00097 if( LAPACKE_dge_nancheck( matrix_order, nv, n, v, ldv ) ) {
00098 return -15;
00099 }
00100 }
00101 #endif
00102
00103 iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * MAX(1,m+3*n) );
00104 if( iwork == NULL ) {
00105 info = LAPACK_WORK_MEMORY_ERROR;
00106 goto exit_level_0;
00107 }
00108 work = (double*)LAPACKE_malloc( sizeof(double) * lwork );
00109 if( work == NULL ) {
00110 info = LAPACK_WORK_MEMORY_ERROR;
00111 goto exit_level_1;
00112 }
00113
00114 info = LAPACKE_dgejsv_work( matrix_order, joba, jobu, jobv, jobr, jobt,
00115 jobp, m, n, a, lda, sva, u, ldu, v, ldv, work,
00116 lwork, iwork );
00117
00118 for( i=0; i<7; i++ ) {
00119 stat[i] = work[i];
00120 }
00121 for( i=0; i<3; i++ ) {
00122 istat[i] = iwork[i];
00123 }
00124
00125 LAPACKE_free( work );
00126 exit_level_1:
00127 LAPACKE_free( iwork );
00128 exit_level_0:
00129 if( info == LAPACK_WORK_MEMORY_ERROR ) {
00130 LAPACKE_xerbla( "LAPACKE_dgejsv", info );
00131 }
00132 return info;
00133 }