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