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_cggesx( int matrix_order, char jobvsl, char jobvsr,
00038 char sort, LAPACK_C_SELECT2 selctg, char sense,
00039 lapack_int n, lapack_complex_float* a,
00040 lapack_int lda, lapack_complex_float* b,
00041 lapack_int ldb, lapack_int* sdim,
00042 lapack_complex_float* alpha,
00043 lapack_complex_float* beta,
00044 lapack_complex_float* vsl, lapack_int ldvsl,
00045 lapack_complex_float* vsr, lapack_int ldvsr,
00046 float* rconde, float* rcondv )
00047 {
00048 lapack_int info = 0;
00049 lapack_int liwork = -1;
00050 lapack_int lwork = -1;
00051 lapack_logical* bwork = NULL;
00052 lapack_int* iwork = NULL;
00053 float* rwork = NULL;
00054 lapack_complex_float* work = NULL;
00055 lapack_int iwork_query;
00056 lapack_complex_float work_query;
00057 if( matrix_order != LAPACK_COL_MAJOR && matrix_order != LAPACK_ROW_MAJOR ) {
00058 LAPACKE_xerbla( "LAPACKE_cggesx", -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 -8;
00065 }
00066 if( LAPACKE_cge_nancheck( matrix_order, n, n, b, ldb ) ) {
00067 return -10;
00068 }
00069 #endif
00070
00071 if( LAPACKE_lsame( sort, 's' ) ) {
00072 bwork = (lapack_logical*)
00073 LAPACKE_malloc( sizeof(lapack_logical) * MAX(1,n) );
00074 if( bwork == NULL ) {
00075 info = LAPACK_WORK_MEMORY_ERROR;
00076 goto exit_level_0;
00077 }
00078 }
00079 rwork = (float*)LAPACKE_malloc( sizeof(float) * MAX(1,8*n) );
00080 if( rwork == NULL ) {
00081 info = LAPACK_WORK_MEMORY_ERROR;
00082 goto exit_level_1;
00083 }
00084
00085 info = LAPACKE_cggesx_work( matrix_order, jobvsl, jobvsr, sort, selctg,
00086 sense, n, a, lda, b, ldb, sdim, alpha, beta,
00087 vsl, ldvsl, vsr, ldvsr, rconde, rcondv,
00088 &work_query, lwork, rwork, &iwork_query, liwork,
00089 bwork );
00090 if( info != 0 ) {
00091 goto exit_level_2;
00092 }
00093 liwork = (lapack_int)iwork_query;
00094 lwork = LAPACK_C2INT( work_query );
00095
00096 iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * liwork );
00097 if( iwork == NULL ) {
00098 info = LAPACK_WORK_MEMORY_ERROR;
00099 goto exit_level_2;
00100 }
00101 work = (lapack_complex_float*)
00102 LAPACKE_malloc( sizeof(lapack_complex_float) * lwork );
00103 if( work == NULL ) {
00104 info = LAPACK_WORK_MEMORY_ERROR;
00105 goto exit_level_3;
00106 }
00107
00108 info = LAPACKE_cggesx_work( matrix_order, jobvsl, jobvsr, sort, selctg,
00109 sense, n, a, lda, b, ldb, sdim, alpha, beta,
00110 vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work,
00111 lwork, rwork, iwork, liwork, bwork );
00112
00113 LAPACKE_free( work );
00114 exit_level_3:
00115 LAPACKE_free( iwork );
00116 exit_level_2:
00117 LAPACKE_free( rwork );
00118 exit_level_1:
00119 if( LAPACKE_lsame( sort, 's' ) ) {
00120 LAPACKE_free( bwork );
00121 }
00122 exit_level_0:
00123 if( info == LAPACK_WORK_MEMORY_ERROR ) {
00124 LAPACKE_xerbla( "LAPACKE_cggesx", info );
00125 }
00126 return info;
00127 }