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_zggsvp_work( int matrix_order, char jobu, char jobv,
00038 char jobq, lapack_int m, lapack_int p,
00039 lapack_int n, lapack_complex_double* a,
00040 lapack_int lda, lapack_complex_double* b,
00041 lapack_int ldb, double tola, double tolb,
00042 lapack_int* k, lapack_int* l,
00043 lapack_complex_double* u, lapack_int ldu,
00044 lapack_complex_double* v, lapack_int ldv,
00045 lapack_complex_double* q, lapack_int ldq,
00046 lapack_int* iwork, double* rwork,
00047 lapack_complex_double* tau,
00048 lapack_complex_double* work )
00049 {
00050 lapack_int info = 0;
00051 if( matrix_order == LAPACK_COL_MAJOR ) {
00052
00053 LAPACK_zggsvp( &jobu, &jobv, &jobq, &m, &p, &n, a, &lda, b, &ldb, &tola,
00054 &tolb, k, l, u, &ldu, v, &ldv, q, &ldq, iwork, rwork,
00055 tau, work, &info );
00056 if( info < 0 ) {
00057 info = info - 1;
00058 }
00059 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00060 lapack_int lda_t = MAX(1,m);
00061 lapack_int ldb_t = MAX(1,p);
00062 lapack_int ldq_t = MAX(1,n);
00063 lapack_int ldu_t = MAX(1,m);
00064 lapack_int ldv_t = MAX(1,p);
00065 lapack_complex_double* a_t = NULL;
00066 lapack_complex_double* b_t = NULL;
00067 lapack_complex_double* u_t = NULL;
00068 lapack_complex_double* v_t = NULL;
00069 lapack_complex_double* q_t = NULL;
00070
00071 if( lda < n ) {
00072 info = -9;
00073 LAPACKE_xerbla( "LAPACKE_zggsvp_work", info );
00074 return info;
00075 }
00076 if( ldb < n ) {
00077 info = -11;
00078 LAPACKE_xerbla( "LAPACKE_zggsvp_work", info );
00079 return info;
00080 }
00081 if( ldq < n ) {
00082 info = -21;
00083 LAPACKE_xerbla( "LAPACKE_zggsvp_work", info );
00084 return info;
00085 }
00086 if( ldu < m ) {
00087 info = -17;
00088 LAPACKE_xerbla( "LAPACKE_zggsvp_work", info );
00089 return info;
00090 }
00091 if( ldv < m ) {
00092 info = -19;
00093 LAPACKE_xerbla( "LAPACKE_zggsvp_work", info );
00094 return info;
00095 }
00096
00097 a_t = (lapack_complex_double*)
00098 LAPACKE_malloc( sizeof(lapack_complex_double) * lda_t * MAX(1,n) );
00099 if( a_t == NULL ) {
00100 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00101 goto exit_level_0;
00102 }
00103 b_t = (lapack_complex_double*)
00104 LAPACKE_malloc( sizeof(lapack_complex_double) * ldb_t * MAX(1,n) );
00105 if( b_t == NULL ) {
00106 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00107 goto exit_level_1;
00108 }
00109 if( LAPACKE_lsame( jobu, 'u' ) ) {
00110 u_t = (lapack_complex_double*)
00111 LAPACKE_malloc( sizeof(lapack_complex_double) *
00112 ldu_t * MAX(1,m) );
00113 if( u_t == NULL ) {
00114 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00115 goto exit_level_2;
00116 }
00117 }
00118 if( LAPACKE_lsame( jobv, 'v' ) ) {
00119 v_t = (lapack_complex_double*)
00120 LAPACKE_malloc( sizeof(lapack_complex_double) *
00121 ldv_t * MAX(1,m) );
00122 if( v_t == NULL ) {
00123 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00124 goto exit_level_3;
00125 }
00126 }
00127 if( LAPACKE_lsame( jobq, 'q' ) ) {
00128 q_t = (lapack_complex_double*)
00129 LAPACKE_malloc( sizeof(lapack_complex_double) *
00130 ldq_t * MAX(1,n) );
00131 if( q_t == NULL ) {
00132 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00133 goto exit_level_4;
00134 }
00135 }
00136
00137 LAPACKE_zge_trans( matrix_order, m, n, a, lda, a_t, lda_t );
00138 LAPACKE_zge_trans( matrix_order, p, n, b, ldb, b_t, ldb_t );
00139
00140 LAPACK_zggsvp( &jobu, &jobv, &jobq, &m, &p, &n, a_t, &lda_t, b_t,
00141 &ldb_t, &tola, &tolb, k, l, u_t, &ldu_t, v_t, &ldv_t,
00142 q_t, &ldq_t, iwork, rwork, tau, work, &info );
00143 if( info < 0 ) {
00144 info = info - 1;
00145 }
00146
00147 LAPACKE_zge_trans( LAPACK_COL_MAJOR, m, n, a_t, lda_t, a, lda );
00148 LAPACKE_zge_trans( LAPACK_COL_MAJOR, p, n, b_t, ldb_t, b, ldb );
00149 if( LAPACKE_lsame( jobu, 'u' ) ) {
00150 LAPACKE_zge_trans( LAPACK_COL_MAJOR, m, m, u_t, ldu_t, u, ldu );
00151 }
00152 if( LAPACKE_lsame( jobv, 'v' ) ) {
00153 LAPACKE_zge_trans( LAPACK_COL_MAJOR, p, m, v_t, ldv_t, v, ldv );
00154 }
00155 if( LAPACKE_lsame( jobq, 'q' ) ) {
00156 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, n, q_t, ldq_t, q, ldq );
00157 }
00158
00159 if( LAPACKE_lsame( jobq, 'q' ) ) {
00160 LAPACKE_free( q_t );
00161 }
00162 exit_level_4:
00163 if( LAPACKE_lsame( jobv, 'v' ) ) {
00164 LAPACKE_free( v_t );
00165 }
00166 exit_level_3:
00167 if( LAPACKE_lsame( jobu, 'u' ) ) {
00168 LAPACKE_free( u_t );
00169 }
00170 exit_level_2:
00171 LAPACKE_free( b_t );
00172 exit_level_1:
00173 LAPACKE_free( a_t );
00174 exit_level_0:
00175 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00176 LAPACKE_xerbla( "LAPACKE_zggsvp_work", info );
00177 }
00178 } else {
00179 info = -1;
00180 LAPACKE_xerbla( "LAPACKE_zggsvp_work", info );
00181 }
00182 return info;
00183 }