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