LAPACK 3.11.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ LAPACKE_cggevx()

lapack_int LAPACKE_cggevx ( int  matrix_layout,
char  balanc,
char  jobvl,
char  jobvr,
char  sense,
lapack_int  n,
lapack_complex_float a,
lapack_int  lda,
lapack_complex_float b,
lapack_int  ldb,
lapack_complex_float alpha,
lapack_complex_float beta,
lapack_complex_float vl,
lapack_int  ldvl,
lapack_complex_float vr,
lapack_int  ldvr,
lapack_int ilo,
lapack_int ihi,
float *  lscale,
float *  rscale,
float *  abnrm,
float *  bbnrm,
float *  rconde,
float *  rcondv 
)

Definition at line 35 of file lapacke_cggevx.c.

45{
46 lapack_int info = 0;
47 lapack_int lwork = -1;
48 /* Additional scalars declarations for work arrays */
49 lapack_int lrwork;
50 lapack_logical* bwork = NULL;
51 lapack_int* iwork = NULL;
52 float* rwork = NULL;
53 lapack_complex_float* work = NULL;
54 lapack_complex_float work_query;
55 if( matrix_layout != LAPACK_COL_MAJOR && matrix_layout != LAPACK_ROW_MAJOR ) {
56 LAPACKE_xerbla( "LAPACKE_cggevx", -1 );
57 return -1;
58 }
59#ifndef LAPACK_DISABLE_NAN_CHECK
60 if( LAPACKE_get_nancheck() ) {
61 /* Optionally check input matrices for NaNs */
62 if( LAPACKE_cge_nancheck( matrix_layout, n, n, a, lda ) ) {
63 return -7;
64 }
65 if( LAPACKE_cge_nancheck( matrix_layout, n, n, b, ldb ) ) {
66 return -9;
67 }
68 }
69#endif
70 /* Additional scalars initializations for work arrays */
71 if( LAPACKE_lsame( balanc, 's' ) || LAPACKE_lsame( balanc, 'b' ) ) {
72 lrwork = MAX(1,6*n);
73 } else {
74 lrwork = MAX(1,2*n);
75 }
76 /* Allocate memory for working array(s) */
77 if( LAPACKE_lsame( sense, 'b' ) || LAPACKE_lsame( sense, 'e' ) ||
78 LAPACKE_lsame( sense, 'v' ) ) {
79 bwork = (lapack_logical*)
80 LAPACKE_malloc( sizeof(lapack_logical) * MAX(1,n) );
81 if( bwork == NULL ) {
83 goto exit_level_0;
84 }
85 }
86 if( LAPACKE_lsame( sense, 'b' ) || LAPACKE_lsame( sense, 'n' ) ||
87 LAPACKE_lsame( sense, 'v' ) ) {
88 iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * MAX(1,n+2) );
89 if( iwork == NULL ) {
91 goto exit_level_1;
92 }
93 }
94 rwork = (float*)LAPACKE_malloc( sizeof(float) * lrwork );
95 if( rwork == NULL ) {
97 goto exit_level_2;
98 }
99 /* Query optimal working array(s) size */
100 info = LAPACKE_cggevx_work( matrix_layout, balanc, jobvl, jobvr, sense, n, a,
101 lda, b, ldb, alpha, beta, vl, ldvl, vr, ldvr,
102 ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde,
103 rcondv, &work_query, lwork, rwork, iwork,
104 bwork );
105 if( info != 0 ) {
106 goto exit_level_3;
107 }
108 lwork = LAPACK_C2INT( work_query );
109 /* Allocate memory for work arrays */
110 work = (lapack_complex_float*)
111 LAPACKE_malloc( sizeof(lapack_complex_float) * lwork );
112 if( work == NULL ) {
114 goto exit_level_3;
115 }
116 /* Call middle-level interface */
117 info = LAPACKE_cggevx_work( matrix_layout, balanc, jobvl, jobvr, sense, n, a,
118 lda, b, ldb, alpha, beta, vl, ldvl, vr, ldvr,
119 ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde,
120 rcondv, work, lwork, rwork, iwork, bwork );
121 /* Release memory and exit */
122 LAPACKE_free( work );
123exit_level_3:
124 LAPACKE_free( rwork );
125exit_level_2:
126 if( LAPACKE_lsame( sense, 'b' ) || LAPACKE_lsame( sense, 'n' ) ||
127 LAPACKE_lsame( sense, 'v' ) ) {
128 LAPACKE_free( iwork );
129 }
130exit_level_1:
131 if( LAPACKE_lsame( sense, 'b' ) || LAPACKE_lsame( sense, 'e' ) ||
132 LAPACKE_lsame( sense, 'v' ) ) {
133 LAPACKE_free( bwork );
134 }
135exit_level_0:
136 if( info == LAPACK_WORK_MEMORY_ERROR ) {
137 LAPACKE_xerbla( "LAPACKE_cggevx", info );
138 }
139 return info;
140}
#define lapack_int
Definition: lapack.h:87
#define lapack_complex_float
Definition: lapack.h:46
#define lapack_logical
Definition: lapack.h:103
lapack_int LAPACKE_cggevx_work(int matrix_layout, char balanc, char jobvl, char jobvr, char sense, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb, lapack_complex_float *alpha, lapack_complex_float *beta, lapack_complex_float *vl, lapack_int ldvl, lapack_complex_float *vr, lapack_int ldvr, lapack_int *ilo, lapack_int *ihi, float *lscale, float *rscale, float *abnrm, float *bbnrm, float *rconde, float *rcondv, lapack_complex_float *work, lapack_int lwork, float *rwork, lapack_int *iwork, lapack_logical *bwork)
#define LAPACK_WORK_MEMORY_ERROR
Definition: lapacke.h:55
#define LAPACK_COL_MAJOR
Definition: lapacke.h:53
#define LAPACK_C2INT(x)
Definition: lapacke.h:49
#define LAPACKE_free(p)
Definition: lapacke.h:46
#define LAPACK_ROW_MAJOR
Definition: lapacke.h:52
int LAPACKE_get_nancheck(void)
#define LAPACKE_malloc(size)
Definition: lapacke.h:43
lapack_logical LAPACKE_lsame(char ca, char cb)
Definition: lapacke_lsame.c:35
void LAPACKE_xerbla(const char *name, lapack_int info)
#define MAX(x, y)
Definition: lapacke_utils.h:46
lapack_logical LAPACKE_cge_nancheck(int matrix_layout, lapack_int m, lapack_int n, const lapack_complex_float *a, lapack_int lda)
Here is the call graph for this function: