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_cggevx( int matrix_order, char balanc, char jobvl,
00038 char jobvr, char sense, lapack_int n,
00039 lapack_complex_float* a, lapack_int lda,
00040 lapack_complex_float* b, lapack_int ldb,
00041 lapack_complex_float* alpha,
00042 lapack_complex_float* beta, lapack_complex_float* vl,
00043 lapack_int ldvl, lapack_complex_float* vr,
00044 lapack_int ldvr, lapack_int* ilo, lapack_int* ihi,
00045 float* lscale, float* rscale, float* abnrm,
00046 float* bbnrm, float* rconde, float* rcondv )
00047 {
00048 lapack_int info = 0;
00049 lapack_int lwork = -1;
00050
00051 lapack_int lrwork;
00052 lapack_logical* bwork = NULL;
00053 lapack_int* iwork = NULL;
00054 float* rwork = NULL;
00055 lapack_complex_float* work = NULL;
00056 lapack_complex_float work_query;
00057 if( matrix_order != LAPACK_COL_MAJOR && matrix_order != LAPACK_ROW_MAJOR ) {
00058 LAPACKE_xerbla( "LAPACKE_cggevx", -1 );
00059 return -1;
00060 }
00061 #ifndef LAPACK_DISABLE_NAN_CHECK
00062
00063 if( LAPACKE_cge_nancheck( matrix_order, n, n, a, lda ) ) {
00064 return -7;
00065 }
00066 if( LAPACKE_cge_nancheck( matrix_order, n, n, b, ldb ) ) {
00067 return -9;
00068 }
00069 #endif
00070
00071 if( LAPACKE_lsame( balanc, 's' ) || LAPACKE_lsame( balanc, 'b' ) ) {
00072 lrwork = MAX(1,6*n);
00073 } else {
00074 lrwork = MAX(1,2*n);
00075 }
00076
00077 if( LAPACKE_lsame( sense, 'b' ) || LAPACKE_lsame( sense, 'e' ) ||
00078 LAPACKE_lsame( sense, 'v' ) ) {
00079 bwork = (lapack_logical*)
00080 LAPACKE_malloc( sizeof(lapack_logical) * MAX(1,n) );
00081 if( bwork == NULL ) {
00082 info = LAPACK_WORK_MEMORY_ERROR;
00083 goto exit_level_0;
00084 }
00085 }
00086 if( LAPACKE_lsame( sense, 'b' ) || LAPACKE_lsame( sense, 'n' ) ||
00087 LAPACKE_lsame( sense, 'v' ) ) {
00088 iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * MAX(1,n+2) );
00089 if( iwork == NULL ) {
00090 info = LAPACK_WORK_MEMORY_ERROR;
00091 goto exit_level_1;
00092 }
00093 }
00094 rwork = (float*)LAPACKE_malloc( sizeof(float) * lrwork );
00095 if( rwork == NULL ) {
00096 info = LAPACK_WORK_MEMORY_ERROR;
00097 goto exit_level_2;
00098 }
00099
00100 info = LAPACKE_cggevx_work( matrix_order, balanc, jobvl, jobvr, sense, n, a,
00101 lda, b, ldb, alpha, beta, vl, ldvl, vr, ldvr,
00102 ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde,
00103 rcondv, &work_query, lwork, rwork, iwork,
00104 bwork );
00105 if( info != 0 ) {
00106 goto exit_level_3;
00107 }
00108 lwork = LAPACK_C2INT( work_query );
00109
00110 work = (lapack_complex_float*)
00111 LAPACKE_malloc( sizeof(lapack_complex_float) * lwork );
00112 if( work == NULL ) {
00113 info = LAPACK_WORK_MEMORY_ERROR;
00114 goto exit_level_3;
00115 }
00116
00117 info = LAPACKE_cggevx_work( matrix_order, balanc, jobvl, jobvr, sense, n, a,
00118 lda, b, ldb, alpha, beta, vl, ldvl, vr, ldvr,
00119 ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde,
00120 rcondv, work, lwork, rwork, iwork, bwork );
00121
00122 LAPACKE_free( work );
00123 exit_level_3:
00124 LAPACKE_free( rwork );
00125 exit_level_2:
00126 if( LAPACKE_lsame( sense, 'b' ) || LAPACKE_lsame( sense, 'n' ) ||
00127 LAPACKE_lsame( sense, 'v' ) ) {
00128 LAPACKE_free( iwork );
00129 }
00130 exit_level_1:
00131 if( LAPACKE_lsame( sense, 'b' ) || LAPACKE_lsame( sense, 'e' ) ||
00132 LAPACKE_lsame( sense, 'v' ) ) {
00133 LAPACKE_free( bwork );
00134 }
00135 exit_level_0:
00136 if( info == LAPACK_WORK_MEMORY_ERROR ) {
00137 LAPACKE_xerbla( "LAPACKE_cggevx", info );
00138 }
00139 return info;
00140 }