numeric-linalg
Educational material on the SciPy implementation of numerical linear algebra algorithms
Name | Size | Mode | |
.. | |||
lapack/LAPACKE/src/lapacke_ztrsyl3_work.c | 3544B | -rw-r--r-- |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
#include "lapacke_utils.h" lapack_int API_SUFFIX(LAPACKE_ztrsyl3_work)( int matrix_layout, char trana, char tranb, lapack_int isgn, lapack_int m, lapack_int n, const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* c, lapack_int ldc, double* scale, double* swork, lapack_int ldswork ) { lapack_int info = 0; if( matrix_layout == LAPACK_COL_MAJOR ) { /* Call LAPACK function and adjust info */ LAPACK_ztrsyl3( &trana, &tranb, &isgn, &m, &n, a, &lda, b, &ldb, c, &ldc, scale, swork, &ldswork, &info ); if( info < 0 ) { info = info - 1; } } else if( matrix_layout == LAPACK_ROW_MAJOR ) { lapack_int lda_t = MAX(1,m); lapack_int ldb_t = MAX(1,n); lapack_int ldc_t = MAX(1,m); lapack_complex_double* a_t = NULL; lapack_complex_double* b_t = NULL; lapack_complex_double* c_t = NULL; /* Check leading dimension(s) */ if( lda < m ) { info = -8; API_SUFFIX(LAPACKE_xerbla)( "LAPACKE_ztrsyl3_work", info ); return info; } if( ldb < n ) { info = -10; API_SUFFIX(LAPACKE_xerbla)( "LAPACKE_ztrsyl3_work", info ); return info; } if( ldc < n ) { info = -12; API_SUFFIX(LAPACKE_xerbla)( "LAPACKE_ztrsyl3_work", info ); return info; } /* Allocate memory for temporary array(s) */ a_t = (lapack_complex_double*) LAPACKE_malloc( sizeof(lapack_complex_double) * lda_t * MAX(1,m) ); if( a_t == NULL ) { info = LAPACK_TRANSPOSE_MEMORY_ERROR; goto exit_level_0; } b_t = (lapack_complex_double*) LAPACKE_malloc( sizeof(lapack_complex_double) * ldb_t * MAX(1,n) ); if( b_t == NULL ) { info = LAPACK_TRANSPOSE_MEMORY_ERROR; goto exit_level_1; } c_t = (lapack_complex_double*) LAPACKE_malloc( sizeof(lapack_complex_double) * ldc_t * MAX(1,n) ); if( c_t == NULL ) { info = LAPACK_TRANSPOSE_MEMORY_ERROR; goto exit_level_2; } /* Transpose input matrices */ API_SUFFIX(LAPACKE_zge_trans)( matrix_layout, m, m, a, lda, a_t, lda_t ); API_SUFFIX(LAPACKE_zge_trans)( matrix_layout, n, n, b, ldb, b_t, ldb_t ); API_SUFFIX(LAPACKE_zge_trans)( matrix_layout, m, n, c, ldc, c_t, ldc_t ); /* Call LAPACK function and adjust info */ LAPACK_ztrsyl3( &trana, &tranb, &isgn, &m, &n, a_t, &lda_t, b_t, &ldb_t, c_t, &ldc_t, scale, swork, &ldswork, &info ); if( info < 0 ) { info = info - 1; } /* Transpose output matrices */ API_SUFFIX(LAPACKE_zge_trans)( LAPACK_COL_MAJOR, m, n, c_t, ldc_t, c, ldc ); /* Release memory and exit */ LAPACKE_free( c_t ); exit_level_2: LAPACKE_free( b_t ); exit_level_1: LAPACKE_free( a_t ); exit_level_0: if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) { API_SUFFIX(LAPACKE_xerbla)( "LAPACKE_ztrsyl3_work", info ); } } else { info = -1; API_SUFFIX(LAPACKE_xerbla)( "LAPACKE_ztrsyl3_work", info ); } return info; }