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_cpprfs_work( int matrix_order, char uplo, lapack_int n,
00038 lapack_int nrhs, const lapack_complex_float* ap,
00039 const lapack_complex_float* afp,
00040 const lapack_complex_float* b, lapack_int ldb,
00041 lapack_complex_float* x, lapack_int ldx,
00042 float* ferr, float* berr,
00043 lapack_complex_float* work, float* rwork )
00044 {
00045 lapack_int info = 0;
00046 if( matrix_order == LAPACK_COL_MAJOR ) {
00047
00048 LAPACK_cpprfs( &uplo, &n, &nrhs, ap, afp, b, &ldb, x, &ldx, ferr, berr,
00049 work, rwork, &info );
00050 if( info < 0 ) {
00051 info = info - 1;
00052 }
00053 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00054 lapack_int ldb_t = MAX(1,n);
00055 lapack_int ldx_t = MAX(1,n);
00056 lapack_complex_float* b_t = NULL;
00057 lapack_complex_float* x_t = NULL;
00058 lapack_complex_float* ap_t = NULL;
00059 lapack_complex_float* afp_t = NULL;
00060
00061 if( ldb < nrhs ) {
00062 info = -8;
00063 LAPACKE_xerbla( "LAPACKE_cpprfs_work", info );
00064 return info;
00065 }
00066 if( ldx < nrhs ) {
00067 info = -10;
00068 LAPACKE_xerbla( "LAPACKE_cpprfs_work", info );
00069 return info;
00070 }
00071
00072 b_t = (lapack_complex_float*)
00073 LAPACKE_malloc( sizeof(lapack_complex_float) *
00074 ldb_t * MAX(1,nrhs) );
00075 if( b_t == NULL ) {
00076 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00077 goto exit_level_0;
00078 }
00079 x_t = (lapack_complex_float*)
00080 LAPACKE_malloc( sizeof(lapack_complex_float) *
00081 ldx_t * MAX(1,nrhs) );
00082 if( x_t == NULL ) {
00083 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00084 goto exit_level_1;
00085 }
00086 ap_t = (lapack_complex_float*)
00087 LAPACKE_malloc( sizeof(lapack_complex_float) *
00088 ( MAX(1,n) * MAX(2,n+1) ) / 2 );
00089 if( ap_t == NULL ) {
00090 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00091 goto exit_level_2;
00092 }
00093 afp_t = (lapack_complex_float*)
00094 LAPACKE_malloc( sizeof(lapack_complex_float) *
00095 ( MAX(1,n) * MAX(2,n+1) ) / 2 );
00096 if( afp_t == NULL ) {
00097 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00098 goto exit_level_3;
00099 }
00100
00101 LAPACKE_cge_trans( matrix_order, n, nrhs, b, ldb, b_t, ldb_t );
00102 LAPACKE_cge_trans( matrix_order, n, nrhs, x, ldx, x_t, ldx_t );
00103 LAPACKE_cpp_trans( matrix_order, uplo, n, ap, ap_t );
00104 LAPACKE_cpp_trans( matrix_order, uplo, n, afp, afp_t );
00105
00106 LAPACK_cpprfs( &uplo, &n, &nrhs, ap_t, afp_t, b_t, &ldb_t, x_t, &ldx_t,
00107 ferr, berr, work, rwork, &info );
00108 if( info < 0 ) {
00109 info = info - 1;
00110 }
00111
00112 LAPACKE_cge_trans( LAPACK_COL_MAJOR, n, nrhs, x_t, ldx_t, x, ldx );
00113
00114 LAPACKE_free( afp_t );
00115 exit_level_3:
00116 LAPACKE_free( ap_t );
00117 exit_level_2:
00118 LAPACKE_free( x_t );
00119 exit_level_1:
00120 LAPACKE_free( b_t );
00121 exit_level_0:
00122 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00123 LAPACKE_xerbla( "LAPACKE_cpprfs_work", info );
00124 }
00125 } else {
00126 info = -1;
00127 LAPACKE_xerbla( "LAPACKE_cpprfs_work", info );
00128 }
00129 return info;
00130 }