LAPACK  3.6.1
LAPACK: Linear Algebra PACKage
lapack_int LAPACKE_ztgsna_work ( int  matrix_layout,
char  job,
char  howmny,
const lapack_logical select,
lapack_int  n,
const lapack_complex_double a,
lapack_int  lda,
const lapack_complex_double b,
lapack_int  ldb,
const lapack_complex_double vl,
lapack_int  ldvl,
const lapack_complex_double vr,
lapack_int  ldvr,
double *  s,
double *  dif,
lapack_int  mm,
lapack_int m,
lapack_complex_double work,
lapack_int  lwork,
lapack_int iwork 
)

Definition at line 36 of file lapacke_ztgsna_work.c.

47 {
48  lapack_int info = 0;
49  if( matrix_layout == LAPACK_COL_MAJOR ) {
50  /* Call LAPACK function and adjust info */
51  LAPACK_ztgsna( &job, &howmny, select, &n, a, &lda, b, &ldb, vl, &ldvl,
52  vr, &ldvr, s, dif, &mm, m, work, &lwork, iwork, &info );
53  if( info < 0 ) {
54  info = info - 1;
55  }
56  } else if( matrix_layout == LAPACK_ROW_MAJOR ) {
57  lapack_int lda_t = MAX(1,n);
58  lapack_int ldb_t = MAX(1,n);
59  lapack_int ldvl_t = MAX(1,n);
60  lapack_int ldvr_t = MAX(1,n);
61  lapack_complex_double* a_t = NULL;
62  lapack_complex_double* b_t = NULL;
63  lapack_complex_double* vl_t = NULL;
64  lapack_complex_double* vr_t = NULL;
65  /* Check leading dimension(s) */
66  if( lda < n ) {
67  info = -7;
68  LAPACKE_xerbla( "LAPACKE_ztgsna_work", info );
69  return info;
70  }
71  if( ldb < n ) {
72  info = -9;
73  LAPACKE_xerbla( "LAPACKE_ztgsna_work", info );
74  return info;
75  }
76  if( ldvl < mm ) {
77  info = -11;
78  LAPACKE_xerbla( "LAPACKE_ztgsna_work", info );
79  return info;
80  }
81  if( ldvr < mm ) {
82  info = -13;
83  LAPACKE_xerbla( "LAPACKE_ztgsna_work", info );
84  return info;
85  }
86  /* Query optimal working array(s) size if requested */
87  if( lwork == -1 ) {
88  LAPACK_ztgsna( &job, &howmny, select, &n, a, &lda_t, b, &ldb_t, vl,
89  &ldvl_t, vr, &ldvr_t, s, dif, &mm, m, work, &lwork,
90  iwork, &info );
91  return (info < 0) ? (info - 1) : info;
92  }
93  /* Allocate memory for temporary array(s) */
94  a_t = (lapack_complex_double*)
95  LAPACKE_malloc( sizeof(lapack_complex_double) * lda_t * MAX(1,n) );
96  if( a_t == NULL ) {
98  goto exit_level_0;
99  }
100  b_t = (lapack_complex_double*)
101  LAPACKE_malloc( sizeof(lapack_complex_double) * ldb_t * MAX(1,n) );
102  if( b_t == NULL ) {
104  goto exit_level_1;
105  }
106  if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
107  vl_t = (lapack_complex_double*)
109  ldvl_t * MAX(1,mm) );
110  if( vl_t == NULL ) {
112  goto exit_level_2;
113  }
114  }
115  if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
116  vr_t = (lapack_complex_double*)
118  ldvr_t * MAX(1,mm) );
119  if( vr_t == NULL ) {
121  goto exit_level_3;
122  }
123  }
124  /* Transpose input matrices */
125  LAPACKE_zge_trans( matrix_layout, n, n, a, lda, a_t, lda_t );
126  LAPACKE_zge_trans( matrix_layout, n, n, b, ldb, b_t, ldb_t );
127  if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
128  LAPACKE_zge_trans( matrix_layout, n, mm, vl, ldvl, vl_t, ldvl_t );
129  }
130  if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
131  LAPACKE_zge_trans( matrix_layout, n, mm, vr, ldvr, vr_t, ldvr_t );
132  }
133  /* Call LAPACK function and adjust info */
134  LAPACK_ztgsna( &job, &howmny, select, &n, a_t, &lda_t, b_t, &ldb_t,
135  vl_t, &ldvl_t, vr_t, &ldvr_t, s, dif, &mm, m, work,
136  &lwork, iwork, &info );
137  if( info < 0 ) {
138  info = info - 1;
139  }
140  /* Release memory and exit */
141  if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
142  LAPACKE_free( vr_t );
143  }
144 exit_level_3:
145  if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
146  LAPACKE_free( vl_t );
147  }
148 exit_level_2:
149  LAPACKE_free( b_t );
150 exit_level_1:
151  LAPACKE_free( a_t );
152 exit_level_0:
153  if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
154  LAPACKE_xerbla( "LAPACKE_ztgsna_work", info );
155  }
156  } else {
157  info = -1;
158  LAPACKE_xerbla( "LAPACKE_ztgsna_work", info );
159  }
160  return info;
161 }
#define LAPACK_ROW_MAJOR
Definition: lapacke.h:119
#define lapack_complex_double
Definition: lapacke.h:90
#define MAX(x, y)
Definition: lapacke_utils.h:47
#define LAPACKE_free(p)
Definition: lapacke.h:113
#define LAPACKE_malloc(size)
Definition: lapacke.h:110
lapack_logical LAPACKE_lsame(char ca, char cb)
Definition: lapacke_lsame.c:36
#define LAPACK_COL_MAJOR
Definition: lapacke.h:120
void LAPACKE_xerbla(const char *name, lapack_int info)
void LAPACK_ztgsna(char *job, char *howmny, const lapack_logical *select, lapack_int *n, const lapack_complex_double *a, lapack_int *lda, const lapack_complex_double *b, lapack_int *ldb, const lapack_complex_double *vl, lapack_int *ldvl, const lapack_complex_double *vr, lapack_int *ldvr, double *s, double *dif, lapack_int *mm, lapack_int *m, lapack_complex_double *work, lapack_int *lwork, lapack_int *iwork, lapack_int *info)
#define lapack_int
Definition: lapacke.h:47
#define LAPACK_TRANSPOSE_MEMORY_ERROR
Definition: lapacke.h:123
void LAPACKE_zge_trans(int matrix_layout, lapack_int m, lapack_int n, const lapack_complex_double *in, lapack_int ldin, lapack_complex_double *out, lapack_int ldout)

Here is the call graph for this function:

Here is the caller graph for this function: