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_dtrsna_work( int matrix_order, char job, char howmny,
00038 const lapack_logical* select, lapack_int n,
00039 const double* t, lapack_int ldt,
00040 const double* vl, lapack_int ldvl,
00041 const double* vr, lapack_int ldvr, double* s,
00042 double* sep, lapack_int mm, lapack_int* m,
00043 double* work, lapack_int ldwork,
00044 lapack_int* iwork )
00045 {
00046 lapack_int info = 0;
00047 if( matrix_order == LAPACK_COL_MAJOR ) {
00048
00049 LAPACK_dtrsna( &job, &howmny, select, &n, t, &ldt, vl, &ldvl, vr, &ldvr,
00050 s, sep, &mm, m, work, &ldwork, iwork, &info );
00051 if( info < 0 ) {
00052 info = info - 1;
00053 }
00054 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00055 lapack_int ldt_t = MAX(1,n);
00056 lapack_int ldvl_t = MAX(1,n);
00057 lapack_int ldvr_t = MAX(1,n);
00058 double* t_t = NULL;
00059 double* vl_t = NULL;
00060 double* vr_t = NULL;
00061
00062 if( ldt < n ) {
00063 info = -7;
00064 LAPACKE_xerbla( "LAPACKE_dtrsna_work", info );
00065 return info;
00066 }
00067 if( ldvl < mm ) {
00068 info = -9;
00069 LAPACKE_xerbla( "LAPACKE_dtrsna_work", info );
00070 return info;
00071 }
00072 if( ldvr < mm ) {
00073 info = -11;
00074 LAPACKE_xerbla( "LAPACKE_dtrsna_work", info );
00075 return info;
00076 }
00077
00078 t_t = (double*)LAPACKE_malloc( sizeof(double) * ldt_t * MAX(1,n) );
00079 if( t_t == NULL ) {
00080 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00081 goto exit_level_0;
00082 }
00083 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00084 vl_t = (double*)
00085 LAPACKE_malloc( sizeof(double) * ldvl_t * MAX(1,mm) );
00086 if( vl_t == NULL ) {
00087 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00088 goto exit_level_1;
00089 }
00090 }
00091 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00092 vr_t = (double*)
00093 LAPACKE_malloc( sizeof(double) * ldvr_t * MAX(1,mm) );
00094 if( vr_t == NULL ) {
00095 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00096 goto exit_level_2;
00097 }
00098 }
00099
00100 LAPACKE_dge_trans( matrix_order, n, n, t, ldt, t_t, ldt_t );
00101 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00102 LAPACKE_dge_trans( matrix_order, n, mm, vl, ldvl, vl_t, ldvl_t );
00103 }
00104 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00105 LAPACKE_dge_trans( matrix_order, n, mm, vr, ldvr, vr_t, ldvr_t );
00106 }
00107
00108 LAPACK_dtrsna( &job, &howmny, select, &n, t_t, &ldt_t, vl_t, &ldvl_t,
00109 vr_t, &ldvr_t, s, sep, &mm, m, work, &ldwork, iwork,
00110 &info );
00111 if( info < 0 ) {
00112 info = info - 1;
00113 }
00114
00115 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00116 LAPACKE_free( vr_t );
00117 }
00118 exit_level_2:
00119 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'e' ) ) {
00120 LAPACKE_free( vl_t );
00121 }
00122 exit_level_1:
00123 LAPACKE_free( t_t );
00124 exit_level_0:
00125 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00126 LAPACKE_xerbla( "LAPACKE_dtrsna_work", info );
00127 }
00128 } else {
00129 info = -1;
00130 LAPACKE_xerbla( "LAPACKE_dtrsna_work", info );
00131 }
00132 return info;
00133 }