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_ztrsyl_work( int matrix_order, char trana, char tranb,
00038 lapack_int isgn, lapack_int m, lapack_int n,
00039 const lapack_complex_double* a, lapack_int lda,
00040 const lapack_complex_double* b, lapack_int ldb,
00041 lapack_complex_double* c, lapack_int ldc,
00042 double* scale )
00043 {
00044 lapack_int info = 0;
00045 if( matrix_order == LAPACK_COL_MAJOR ) {
00046
00047 LAPACK_ztrsyl( &trana, &tranb, &isgn, &m, &n, a, &lda, b, &ldb, c, &ldc,
00048 scale, &info );
00049 if( info < 0 ) {
00050 info = info - 1;
00051 }
00052 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00053 lapack_int lda_t = MAX(1,m);
00054 lapack_int ldb_t = MAX(1,n);
00055 lapack_int ldc_t = MAX(1,m);
00056 lapack_complex_double* a_t = NULL;
00057 lapack_complex_double* b_t = NULL;
00058 lapack_complex_double* c_t = NULL;
00059
00060 if( lda < m ) {
00061 info = -8;
00062 LAPACKE_xerbla( "LAPACKE_ztrsyl_work", info );
00063 return info;
00064 }
00065 if( ldb < n ) {
00066 info = -10;
00067 LAPACKE_xerbla( "LAPACKE_ztrsyl_work", info );
00068 return info;
00069 }
00070 if( ldc < n ) {
00071 info = -12;
00072 LAPACKE_xerbla( "LAPACKE_ztrsyl_work", info );
00073 return info;
00074 }
00075
00076 a_t = (lapack_complex_double*)
00077 LAPACKE_malloc( sizeof(lapack_complex_double) * lda_t * MAX(1,m) );
00078 if( a_t == NULL ) {
00079 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00080 goto exit_level_0;
00081 }
00082 b_t = (lapack_complex_double*)
00083 LAPACKE_malloc( sizeof(lapack_complex_double) * ldb_t * MAX(1,n) );
00084 if( b_t == NULL ) {
00085 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00086 goto exit_level_1;
00087 }
00088 c_t = (lapack_complex_double*)
00089 LAPACKE_malloc( sizeof(lapack_complex_double) * ldc_t * MAX(1,n) );
00090 if( c_t == NULL ) {
00091 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00092 goto exit_level_2;
00093 }
00094
00095 LAPACKE_zge_trans( matrix_order, m, m, a, lda, a_t, lda_t );
00096 LAPACKE_zge_trans( matrix_order, n, n, b, ldb, b_t, ldb_t );
00097 LAPACKE_zge_trans( matrix_order, m, n, c, ldc, c_t, ldc_t );
00098
00099 LAPACK_ztrsyl( &trana, &tranb, &isgn, &m, &n, a_t, &lda_t, b_t, &ldb_t,
00100 c_t, &ldc_t, scale, &info );
00101 if( info < 0 ) {
00102 info = info - 1;
00103 }
00104
00105 LAPACKE_zge_trans( LAPACK_COL_MAJOR, m, n, c_t, ldc_t, c, ldc );
00106
00107 LAPACKE_free( c_t );
00108 exit_level_2:
00109 LAPACKE_free( b_t );
00110 exit_level_1:
00111 LAPACKE_free( a_t );
00112 exit_level_0:
00113 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00114 LAPACKE_xerbla( "LAPACKE_ztrsyl_work", info );
00115 }
00116 } else {
00117 info = -1;
00118 LAPACKE_xerbla( "LAPACKE_ztrsyl_work", info );
00119 }
00120 return info;
00121 }