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_dhgeqz_work( int matrix_order, char job, char compq,
00038 char compz, lapack_int n, lapack_int ilo,
00039 lapack_int ihi, double* h, lapack_int ldh,
00040 double* t, lapack_int ldt, double* alphar,
00041 double* alphai, double* beta, double* q,
00042 lapack_int ldq, double* z, lapack_int ldz,
00043 double* work, lapack_int lwork )
00044 {
00045 lapack_int info = 0;
00046 if( matrix_order == LAPACK_COL_MAJOR ) {
00047
00048 LAPACK_dhgeqz( &job, &compq, &compz, &n, &ilo, &ihi, h, &ldh, t, &ldt,
00049 alphar, alphai, beta, q, &ldq, z, &ldz, work, &lwork,
00050 &info );
00051 if( info < 0 ) {
00052 info = info - 1;
00053 }
00054 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00055 lapack_int ldh_t = MAX(1,n);
00056 lapack_int ldq_t = MAX(1,n);
00057 lapack_int ldt_t = MAX(1,n);
00058 lapack_int ldz_t = MAX(1,n);
00059 double* h_t = NULL;
00060 double* t_t = NULL;
00061 double* q_t = NULL;
00062 double* z_t = NULL;
00063
00064 if( ldh < n ) {
00065 info = -9;
00066 LAPACKE_xerbla( "LAPACKE_dhgeqz_work", info );
00067 return info;
00068 }
00069 if( ldq < n ) {
00070 info = -16;
00071 LAPACKE_xerbla( "LAPACKE_dhgeqz_work", info );
00072 return info;
00073 }
00074 if( ldt < n ) {
00075 info = -11;
00076 LAPACKE_xerbla( "LAPACKE_dhgeqz_work", info );
00077 return info;
00078 }
00079 if( ldz < n ) {
00080 info = -18;
00081 LAPACKE_xerbla( "LAPACKE_dhgeqz_work", info );
00082 return info;
00083 }
00084
00085 if( lwork == -1 ) {
00086 LAPACK_dhgeqz( &job, &compq, &compz, &n, &ilo, &ihi, h, &ldh_t, t,
00087 &ldt_t, alphar, alphai, beta, q, &ldq_t, z, &ldz_t,
00088 work, &lwork, &info );
00089 return (info < 0) ? (info - 1) : info;
00090 }
00091
00092 h_t = (double*)LAPACKE_malloc( sizeof(double) * ldh_t * MAX(1,n) );
00093 if( h_t == NULL ) {
00094 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00095 goto exit_level_0;
00096 }
00097 t_t = (double*)LAPACKE_malloc( sizeof(double) * ldt_t * MAX(1,n) );
00098 if( t_t == NULL ) {
00099 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00100 goto exit_level_1;
00101 }
00102 if( LAPACKE_lsame( compq, 'i' ) || LAPACKE_lsame( compq, 'v' ) ) {
00103 q_t = (double*)LAPACKE_malloc( sizeof(double) * ldq_t * MAX(1,n) );
00104 if( q_t == NULL ) {
00105 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00106 goto exit_level_2;
00107 }
00108 }
00109 if( LAPACKE_lsame( compz, 'i' ) || LAPACKE_lsame( compz, 'v' ) ) {
00110 z_t = (double*)LAPACKE_malloc( sizeof(double) * ldz_t * MAX(1,n) );
00111 if( z_t == NULL ) {
00112 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00113 goto exit_level_3;
00114 }
00115 }
00116
00117 LAPACKE_dge_trans( matrix_order, n, n, h, ldh, h_t, ldh_t );
00118 LAPACKE_dge_trans( matrix_order, n, n, t, ldt, t_t, ldt_t );
00119 if( LAPACKE_lsame( compq, 'v' ) ) {
00120 LAPACKE_dge_trans( matrix_order, n, n, q, ldq, q_t, ldq_t );
00121 }
00122 if( LAPACKE_lsame( compz, 'v' ) ) {
00123 LAPACKE_dge_trans( matrix_order, n, n, z, ldz, z_t, ldz_t );
00124 }
00125
00126 LAPACK_dhgeqz( &job, &compq, &compz, &n, &ilo, &ihi, h_t, &ldh_t, t_t,
00127 &ldt_t, alphar, alphai, beta, q_t, &ldq_t, z_t, &ldz_t,
00128 work, &lwork, &info );
00129 if( info < 0 ) {
00130 info = info - 1;
00131 }
00132
00133 LAPACKE_dge_trans( LAPACK_COL_MAJOR, n, n, h_t, ldh_t, h, ldh );
00134 LAPACKE_dge_trans( LAPACK_COL_MAJOR, n, n, t_t, ldt_t, t, ldt );
00135 if( LAPACKE_lsame( compq, 'i' ) || LAPACKE_lsame( compq, 'v' ) ) {
00136 LAPACKE_dge_trans( LAPACK_COL_MAJOR, n, n, q_t, ldq_t, q, ldq );
00137 }
00138 if( LAPACKE_lsame( compz, 'i' ) || LAPACKE_lsame( compz, 'v' ) ) {
00139 LAPACKE_dge_trans( LAPACK_COL_MAJOR, n, n, z_t, ldz_t, z, ldz );
00140 }
00141
00142 if( LAPACKE_lsame( compz, 'i' ) || LAPACKE_lsame( compz, 'v' ) ) {
00143 LAPACKE_free( z_t );
00144 }
00145 exit_level_3:
00146 if( LAPACKE_lsame( compq, 'i' ) || LAPACKE_lsame( compq, 'v' ) ) {
00147 LAPACKE_free( q_t );
00148 }
00149 exit_level_2:
00150 LAPACKE_free( t_t );
00151 exit_level_1:
00152 LAPACKE_free( h_t );
00153 exit_level_0:
00154 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00155 LAPACKE_xerbla( "LAPACKE_dhgeqz_work", info );
00156 }
00157 } else {
00158 info = -1;
00159 LAPACKE_xerbla( "LAPACKE_dhgeqz_work", info );
00160 }
00161 return info;
00162 }