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_ctrsna_work( int matrix_order, char job, char howmny,
00038 const lapack_logical* select, lapack_int n,
00039 const lapack_complex_float* t, lapack_int ldt,
00040 const lapack_complex_float* vl, lapack_int ldvl,
00041 const lapack_complex_float* vr, lapack_int ldvr,
00042 float* s, float* sep, lapack_int mm,
00043 lapack_int* m, lapack_complex_float* work,
00044 lapack_int ldwork, float* rwork )
00045 {
00046 lapack_int info = 0;
00047 if( matrix_order == LAPACK_COL_MAJOR ) {
00048
00049 LAPACK_ctrsna( &job, &howmny, select, &n, t, &ldt, vl, &ldvl, vr, &ldvr,
00050 s, sep, &mm, m, work, &ldwork, rwork, &info );
00051 if( info < 0 ) {
00052 info = info - 1;
00053 }
00054 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00055 lapack_int ldt_t = MAX(1,n);
00056 lapack_int ldvl_t = MAX(1,n);
00057 lapack_int ldvr_t = MAX(1,n);
00058 lapack_complex_float* t_t = NULL;
00059 lapack_complex_float* vl_t = NULL;
00060 lapack_complex_float* vr_t = NULL;
00061
00062 if( ldt < n ) {
00063 info = -7;
00064 LAPACKE_xerbla( "LAPACKE_ctrsna_work", info );
00065 return info;
00066 }
00067 if( ldvl < mm ) {
00068 info = -9;
00069 LAPACKE_xerbla( "LAPACKE_ctrsna_work", info );
00070 return info;
00071 }
00072 if( ldvr < mm ) {
00073 info = -11;
00074 LAPACKE_xerbla( "LAPACKE_ctrsna_work", info );
00075 return info;
00076 }
00077
00078 t_t = (lapack_complex_float*)
00079 LAPACKE_malloc( sizeof(lapack_complex_float) * ldt_t * MAX(1,n) );
00080 if( t_t == NULL ) {
00081 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00082 goto exit_level_0;
00083 }
00084 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00085 vl_t = (lapack_complex_float*)
00086 LAPACKE_malloc( sizeof(lapack_complex_float) *
00087 ldvl_t * MAX(1,mm) );
00088 if( vl_t == NULL ) {
00089 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00090 goto exit_level_1;
00091 }
00092 }
00093 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00094 vr_t = (lapack_complex_float*)
00095 LAPACKE_malloc( sizeof(lapack_complex_float) *
00096 ldvr_t * MAX(1,mm) );
00097 if( vr_t == NULL ) {
00098 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00099 goto exit_level_2;
00100 }
00101 }
00102
00103 LAPACKE_cge_trans( matrix_order, n, n, t, ldt, t_t, ldt_t );
00104 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00105 LAPACKE_cge_trans( matrix_order, n, mm, vl, ldvl, vl_t, ldvl_t );
00106 }
00107 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00108 LAPACKE_cge_trans( matrix_order, n, mm, vr, ldvr, vr_t, ldvr_t );
00109 }
00110
00111 LAPACK_ctrsna( &job, &howmny, select, &n, t_t, &ldt_t, vl_t, &ldvl_t,
00112 vr_t, &ldvr_t, s, sep, &mm, m, work, &ldwork, rwork,
00113 &info );
00114 if( info < 0 ) {
00115 info = info - 1;
00116 }
00117
00118 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00119 LAPACKE_free( vr_t );
00120 }
00121 exit_level_2:
00122 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00123 LAPACKE_free( vl_t );
00124 }
00125 exit_level_1:
00126 LAPACKE_free( t_t );
00127 exit_level_0:
00128 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00129 LAPACKE_xerbla( "LAPACKE_ctrsna_work", info );
00130 }
00131 } else {
00132 info = -1;
00133 LAPACKE_xerbla( "LAPACKE_ctrsna_work", info );
00134 }
00135 return info;
00136 }