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_ztgsna( int matrix_order, char job, char howmny,
00038 const lapack_logical* select, lapack_int n,
00039 const lapack_complex_double* a, lapack_int lda,
00040 const lapack_complex_double* b, lapack_int ldb,
00041 const lapack_complex_double* vl, lapack_int ldvl,
00042 const lapack_complex_double* vr, lapack_int ldvr,
00043 double* s, double* dif, lapack_int mm,
00044 lapack_int* m )
00045 {
00046 lapack_int info = 0;
00047 lapack_int lwork = -1;
00048 lapack_int* iwork = NULL;
00049 lapack_complex_double* work = NULL;
00050 lapack_complex_double work_query;
00051 if( matrix_order != LAPACK_COL_MAJOR && matrix_order != LAPACK_ROW_MAJOR ) {
00052 LAPACKE_xerbla( "LAPACKE_ztgsna", -1 );
00053 return -1;
00054 }
00055 #ifndef LAPACK_DISABLE_NAN_CHECK
00056
00057 if( LAPACKE_zge_nancheck( matrix_order, n, n, a, lda ) ) {
00058 return -6;
00059 }
00060 if( LAPACKE_zge_nancheck( matrix_order, n, n, b, ldb ) ) {
00061 return -8;
00062 }
00063 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00064 if( LAPACKE_zge_nancheck( matrix_order, n, mm, vl, ldvl ) ) {
00065 return -10;
00066 }
00067 }
00068 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00069 if( LAPACKE_zge_nancheck( matrix_order, n, mm, vr, ldvr ) ) {
00070 return -12;
00071 }
00072 }
00073 #endif
00074
00075 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'v' ) ) {
00076 iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * MAX(1,n+2) );
00077 if( iwork == NULL ) {
00078 info = LAPACK_WORK_MEMORY_ERROR;
00079 goto exit_level_0;
00080 }
00081 }
00082
00083 info = LAPACKE_ztgsna_work( matrix_order, job, howmny, select, n, a, lda, b,
00084 ldb, vl, ldvl, vr, ldvr, s, dif, mm, m,
00085 &work_query, lwork, iwork );
00086 if( info != 0 ) {
00087 goto exit_level_1;
00088 }
00089 lwork = LAPACK_Z2INT( work_query );
00090
00091 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'v' ) ) {
00092 work = (lapack_complex_double*)
00093 LAPACKE_malloc( sizeof(lapack_complex_double) * lwork );
00094 if( work == NULL ) {
00095 info = LAPACK_WORK_MEMORY_ERROR;
00096 goto exit_level_1;
00097 }
00098 }
00099
00100 info = LAPACKE_ztgsna_work( matrix_order, job, howmny, select, n, a, lda, b,
00101 ldb, vl, ldvl, vr, ldvr, s, dif, mm, m, work,
00102 lwork, iwork );
00103
00104 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'v' ) ) {
00105 LAPACKE_free( work );
00106 }
00107 exit_level_1:
00108 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'v' ) ) {
00109 LAPACKE_free( iwork );
00110 }
00111 exit_level_0:
00112 if( info == LAPACK_WORK_MEMORY_ERROR ) {
00113 LAPACKE_xerbla( "LAPACKE_ztgsna", info );
00114 }
00115 return info;
00116 }