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