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_dggesx( int matrix_order, char jobvsl, char jobvsr,
00038 char sort, LAPACK_D_SELECT3 selctg, char sense,
00039 lapack_int n, double* a, lapack_int lda, double* b,
00040 lapack_int ldb, lapack_int* sdim, double* alphar,
00041 double* alphai, double* beta, double* vsl,
00042 lapack_int ldvsl, double* vsr, lapack_int ldvsr,
00043 double* rconde, double* rcondv )
00044 {
00045 lapack_int info = 0;
00046 lapack_int liwork = -1;
00047 lapack_int lwork = -1;
00048 lapack_logical* bwork = NULL;
00049 lapack_int* iwork = NULL;
00050 double* work = NULL;
00051 lapack_int iwork_query;
00052 double work_query;
00053 if( matrix_order != LAPACK_COL_MAJOR && matrix_order != LAPACK_ROW_MAJOR ) {
00054 LAPACKE_xerbla( "LAPACKE_dggesx", -1 );
00055 return -1;
00056 }
00057 #ifndef LAPACK_DISABLE_NAN_CHECK
00058
00059 if( LAPACKE_dge_nancheck( matrix_order, n, n, a, lda ) ) {
00060 return -8;
00061 }
00062 if( LAPACKE_dge_nancheck( matrix_order, n, n, b, ldb ) ) {
00063 return -10;
00064 }
00065 #endif
00066
00067 if( LAPACKE_lsame( sort, 's' ) ) {
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
00076 info = LAPACKE_dggesx_work( matrix_order, jobvsl, jobvsr, sort, selctg,
00077 sense, n, a, lda, b, ldb, sdim, alphar, alphai,
00078 beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv,
00079 &work_query, lwork, &iwork_query, liwork,
00080 bwork );
00081 if( info != 0 ) {
00082 goto exit_level_1;
00083 }
00084 liwork = (lapack_int)iwork_query;
00085 lwork = (lapack_int)work_query;
00086
00087 iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * liwork );
00088 if( iwork == NULL ) {
00089 info = LAPACK_WORK_MEMORY_ERROR;
00090 goto exit_level_1;
00091 }
00092 work = (double*)LAPACKE_malloc( sizeof(double) * lwork );
00093 if( work == NULL ) {
00094 info = LAPACK_WORK_MEMORY_ERROR;
00095 goto exit_level_2;
00096 }
00097
00098 info = LAPACKE_dggesx_work( matrix_order, jobvsl, jobvsr, sort, selctg,
00099 sense, n, a, lda, b, ldb, sdim, alphar, alphai,
00100 beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv,
00101 work, lwork, iwork, liwork, bwork );
00102
00103 LAPACKE_free( work );
00104 exit_level_2:
00105 LAPACKE_free( iwork );
00106 exit_level_1:
00107 if( LAPACKE_lsame( sort, 's' ) ) {
00108 LAPACKE_free( bwork );
00109 }
00110 exit_level_0:
00111 if( info == LAPACK_WORK_MEMORY_ERROR ) {
00112 LAPACKE_xerbla( "LAPACKE_dggesx", info );
00113 }
00114 return info;
00115 }