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_stgsna_work( int matrix_order, char job, char howmny,
00038 const lapack_logical* select, lapack_int n,
00039 const float* a, lapack_int lda, const float* b,
00040 lapack_int ldb, const float* vl,
00041 lapack_int ldvl, const float* vr,
00042 lapack_int ldvr, float* s, float* dif,
00043 lapack_int mm, lapack_int* m, float* work,
00044 lapack_int lwork, lapack_int* iwork )
00045 {
00046 lapack_int info = 0;
00047 if( matrix_order == LAPACK_COL_MAJOR ) {
00048
00049 LAPACK_stgsna( &job, &howmny, select, &n, a, &lda, b, &ldb, vl, &ldvl,
00050 vr, &ldvr, s, dif, &mm, m, work, &lwork, iwork, &info );
00051 if( info < 0 ) {
00052 info = info - 1;
00053 }
00054 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00055 lapack_int lda_t = MAX(1,n);
00056 lapack_int ldb_t = MAX(1,n);
00057 lapack_int ldvl_t = MAX(1,n);
00058 lapack_int ldvr_t = MAX(1,n);
00059 float* a_t = NULL;
00060 float* b_t = NULL;
00061 float* vl_t = NULL;
00062 float* vr_t = NULL;
00063
00064 if( lda < n ) {
00065 info = -7;
00066 LAPACKE_xerbla( "LAPACKE_stgsna_work", info );
00067 return info;
00068 }
00069 if( ldb < n ) {
00070 info = -9;
00071 LAPACKE_xerbla( "LAPACKE_stgsna_work", info );
00072 return info;
00073 }
00074 if( ldvl < mm ) {
00075 info = -11;
00076 LAPACKE_xerbla( "LAPACKE_stgsna_work", info );
00077 return info;
00078 }
00079 if( ldvr < mm ) {
00080 info = -13;
00081 LAPACKE_xerbla( "LAPACKE_stgsna_work", info );
00082 return info;
00083 }
00084
00085 if( lwork == -1 ) {
00086 LAPACK_stgsna( &job, &howmny, select, &n, a, &lda_t, b, &ldb_t, vl,
00087 &ldvl_t, vr, &ldvr_t, s, dif, &mm, m, work, &lwork,
00088 iwork, &info );
00089 return (info < 0) ? (info - 1) : info;
00090 }
00091
00092 a_t = (float*)LAPACKE_malloc( sizeof(float) * lda_t * MAX(1,n) );
00093 if( a_t == NULL ) {
00094 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00095 goto exit_level_0;
00096 }
00097 b_t = (float*)LAPACKE_malloc( sizeof(float) * ldb_t * MAX(1,n) );
00098 if( b_t == NULL ) {
00099 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00100 goto exit_level_1;
00101 }
00102 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00103 vl_t = (float*)LAPACKE_malloc( sizeof(float) * ldvl_t * MAX(1,mm) );
00104 if( vl_t == NULL ) {
00105 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00106 goto exit_level_2;
00107 }
00108 }
00109 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00110 vr_t = (float*)LAPACKE_malloc( sizeof(float) * ldvr_t * MAX(1,mm) );
00111 if( vr_t == NULL ) {
00112 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00113 goto exit_level_3;
00114 }
00115 }
00116
00117 LAPACKE_sge_trans( matrix_order, n, n, a, lda, a_t, lda_t );
00118 LAPACKE_sge_trans( matrix_order, n, n, b, ldb, b_t, ldb_t );
00119 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00120 LAPACKE_sge_trans( matrix_order, n, mm, vl, ldvl, vl_t, ldvl_t );
00121 }
00122 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00123 LAPACKE_sge_trans( matrix_order, n, mm, vr, ldvr, vr_t, ldvr_t );
00124 }
00125
00126 LAPACK_stgsna( &job, &howmny, select, &n, a_t, &lda_t, b_t, &ldb_t,
00127 vl_t, &ldvl_t, vr_t, &ldvr_t, s, dif, &mm, m, work,
00128 &lwork, iwork, &info );
00129 if( info < 0 ) {
00130 info = info - 1;
00131 }
00132
00133 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00134 LAPACKE_free( vr_t );
00135 }
00136 exit_level_3:
00137 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00138 LAPACKE_free( vl_t );
00139 }
00140 exit_level_2:
00141 LAPACKE_free( b_t );
00142 exit_level_1:
00143 LAPACKE_free( a_t );
00144 exit_level_0:
00145 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00146 LAPACKE_xerbla( "LAPACKE_stgsna_work", info );
00147 }
00148 } else {
00149 info = -1;
00150 LAPACKE_xerbla( "LAPACKE_stgsna_work", info );
00151 }
00152 return info;
00153 }