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