lapack_int LAPACKE_ztfsm( int matrix_layout, char transr, char side, char uplo, char trans, char diag, lapack_int m, lapack_int n, lapack_complex_double alpha, const lapack_complex_double* a, lapack_complex_double* b, lapack_int ldb ) { if( matrix_layout != LAPACK_COL_MAJOR && matrix_layout != LAPACK_ROW_MAJOR ) { LAPACKE_xerbla( "LAPACKE_ztfsm", -1 ); return -1; } #ifndef LAPACK_DISABLE_NAN_CHECK if( LAPACKE_get_nancheck() ) { /* Optionally check input matrices for NaNs */ if( IS_Z_NONZERO(alpha) ) { if( LAPACKE_ztf_nancheck( matrix_layout, transr, uplo, diag, n, a ) ) { return -10; } } if( LAPACKE_z_nancheck( 1, &alpha, 1 ) ) { return -9; } if( IS_Z_NONZERO(alpha) ) { if( LAPACKE_zge_nancheck( matrix_layout, m, n, b, ldb ) ) { return -11; } } } #endif return LAPACKE_ztfsm_work( matrix_layout, transr, side, uplo, trans, diag, m, n, alpha, a, b, ldb ); }
lapack_int LAPACKE_ztfsm_work( int matrix_order, char transr, char side, char uplo, char trans, char diag, lapack_int m, lapack_int n, lapack_complex_double alpha, const lapack_complex_double* a, lapack_complex_double* b, lapack_int ldb ) { lapack_int info = 0; if( matrix_order == LAPACK_COL_MAJOR ) { /* Call LAPACK function and adjust info */ LAPACK_ztfsm( &transr, &side, &uplo, &trans, &diag, &m, &n, &alpha, a, b, &ldb ); if( info < 0 ) { info = info - 1; } } else if( matrix_order == LAPACK_ROW_MAJOR ) { lapack_int ldb_t = MAX(1,m); lapack_complex_double* b_t = NULL; lapack_complex_double* a_t = NULL; /* Check leading dimension(s) */ if( ldb < n ) { info = -12; LAPACKE_xerbla( "LAPACKE_ztfsm_work", info ); return info; } /* Allocate memory for temporary array(s) */ 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_0; } if( IS_Z_NONZERO(alpha) ) { a_t = (lapack_complex_double*) LAPACKE_malloc( sizeof(lapack_complex_double) * ( MAX(1,n) * MAX(2,n+1) ) / 2 ); if( a_t == NULL ) { info = LAPACK_TRANSPOSE_MEMORY_ERROR; goto exit_level_1; } } /* Transpose input matrices */ if( IS_Z_NONZERO(alpha) ) { LAPACKE_zge_trans( matrix_order, m, n, b, ldb, b_t, ldb_t ); } if( IS_Z_NONZERO(alpha) ) { LAPACKE_ztf_trans( matrix_order, transr, uplo, diag, n, a, a_t ); } /* Call LAPACK function and adjust info */ LAPACK_ztfsm( &transr, &side, &uplo, &trans, &diag, &m, &n, &alpha, a_t, b_t, &ldb_t ); info = 0; /* LAPACK call is ok! */ /* Transpose output matrices */ LAPACKE_zge_trans( LAPACK_COL_MAJOR, m, n, b_t, ldb_t, b, ldb ); /* Release memory and exit */ if( IS_Z_NONZERO(alpha) ) { LAPACKE_free( a_t ); } exit_level_1: LAPACKE_free( b_t ); exit_level_0: if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) { LAPACKE_xerbla( "LAPACKE_ztfsm_work", info ); } } else { info = -1; LAPACKE_xerbla( "LAPACKE_ztfsm_work", info ); } return info; }