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