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_zgges( int matrix_order, char jobvsl, char jobvsr, char sort,
00038 LAPACK_Z_SELECT2 selctg, lapack_int n,
00039 lapack_complex_double* a, lapack_int lda,
00040 lapack_complex_double* b, lapack_int ldb,
00041 lapack_int* sdim, lapack_complex_double* alpha,
00042 lapack_complex_double* beta,
00043 lapack_complex_double* vsl, lapack_int ldvsl,
00044 lapack_complex_double* vsr, lapack_int ldvsr )
00045 {
00046 lapack_int info = 0;
00047 lapack_int lwork = -1;
00048 lapack_logical* bwork = NULL;
00049 double* rwork = NULL;
00050 lapack_complex_double* work = NULL;
00051 lapack_complex_double work_query;
00052 if( matrix_order != LAPACK_COL_MAJOR && matrix_order != LAPACK_ROW_MAJOR ) {
00053 LAPACKE_xerbla( "LAPACKE_zgges", -1 );
00054 return -1;
00055 }
00056 #ifndef LAPACK_DISABLE_NAN_CHECK
00057
00058 if( LAPACKE_zge_nancheck( matrix_order, n, n, a, lda ) ) {
00059 return -7;
00060 }
00061 if( LAPACKE_zge_nancheck( matrix_order, n, n, b, ldb ) ) {
00062 return -9;
00063 }
00064 #endif
00065
00066 if( LAPACKE_lsame( sort, 's' ) ) {
00067 bwork = (lapack_logical*)
00068 LAPACKE_malloc( sizeof(lapack_logical) * MAX(1,n) );
00069 if( bwork == NULL ) {
00070 info = LAPACK_WORK_MEMORY_ERROR;
00071 goto exit_level_0;
00072 }
00073 }
00074 rwork = (double*)LAPACKE_malloc( sizeof(double) * MAX(1,8*n) );
00075 if( rwork == NULL ) {
00076 info = LAPACK_WORK_MEMORY_ERROR;
00077 goto exit_level_1;
00078 }
00079
00080 info = LAPACKE_zgges_work( matrix_order, jobvsl, jobvsr, sort, selctg, n, a,
00081 lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr,
00082 ldvsr, &work_query, lwork, rwork, bwork );
00083 if( info != 0 ) {
00084 goto exit_level_2;
00085 }
00086 lwork = LAPACK_Z2INT( work_query );
00087
00088 work = (lapack_complex_double*)
00089 LAPACKE_malloc( sizeof(lapack_complex_double) * lwork );
00090 if( work == NULL ) {
00091 info = LAPACK_WORK_MEMORY_ERROR;
00092 goto exit_level_2;
00093 }
00094
00095 info = LAPACKE_zgges_work( matrix_order, jobvsl, jobvsr, sort, selctg, n, a,
00096 lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr,
00097 ldvsr, work, lwork, rwork, bwork );
00098
00099 LAPACKE_free( work );
00100 exit_level_2:
00101 LAPACKE_free( rwork );
00102 exit_level_1:
00103 if( LAPACKE_lsame( sort, 's' ) ) {
00104 LAPACKE_free( bwork );
00105 }
00106 exit_level_0:
00107 if( info == LAPACK_WORK_MEMORY_ERROR ) {
00108 LAPACKE_xerbla( "LAPACKE_zgges", info );
00109 }
00110 return info;
00111 }