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_cporfsx_work( int matrix_order, char uplo, char equed,
00038 lapack_int n, lapack_int nrhs,
00039 const lapack_complex_float* a, lapack_int lda,
00040 const lapack_complex_float* af,
00041 lapack_int ldaf, const float* s,
00042 const lapack_complex_float* b, lapack_int ldb,
00043 lapack_complex_float* x, lapack_int ldx,
00044 float* rcond, float* berr,
00045 lapack_int n_err_bnds, float* err_bnds_norm,
00046 float* err_bnds_comp, lapack_int nparams,
00047 float* params, lapack_complex_float* work,
00048 float* rwork )
00049 {
00050 lapack_int info = 0;
00051 if( matrix_order == LAPACK_COL_MAJOR ) {
00052
00053 LAPACK_cporfsx( &uplo, &equed, &n, &nrhs, a, &lda, af, &ldaf, s, b,
00054 &ldb, x, &ldx, rcond, berr, &n_err_bnds, err_bnds_norm,
00055 err_bnds_comp, &nparams, params, work, rwork, &info );
00056 if( info < 0 ) {
00057 info = info - 1;
00058 }
00059 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00060 lapack_int lda_t = MAX(1,n);
00061 lapack_int ldaf_t = MAX(1,n);
00062 lapack_int ldb_t = MAX(1,n);
00063 lapack_int ldx_t = MAX(1,n);
00064 lapack_complex_float* a_t = NULL;
00065 lapack_complex_float* af_t = NULL;
00066 lapack_complex_float* b_t = NULL;
00067 lapack_complex_float* x_t = NULL;
00068 float* err_bnds_norm_t = NULL;
00069 float* err_bnds_comp_t = NULL;
00070
00071 if( lda < n ) {
00072 info = -7;
00073 LAPACKE_xerbla( "LAPACKE_cporfsx_work", info );
00074 return info;
00075 }
00076 if( ldaf < n ) {
00077 info = -9;
00078 LAPACKE_xerbla( "LAPACKE_cporfsx_work", info );
00079 return info;
00080 }
00081 if( ldb < nrhs ) {
00082 info = -12;
00083 LAPACKE_xerbla( "LAPACKE_cporfsx_work", info );
00084 return info;
00085 }
00086 if( ldx < nrhs ) {
00087 info = -14;
00088 LAPACKE_xerbla( "LAPACKE_cporfsx_work", info );
00089 return info;
00090 }
00091
00092 a_t = (lapack_complex_float*)
00093 LAPACKE_malloc( sizeof(lapack_complex_float) * lda_t * MAX(1,n) );
00094 if( a_t == NULL ) {
00095 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00096 goto exit_level_0;
00097 }
00098 af_t = (lapack_complex_float*)
00099 LAPACKE_malloc( sizeof(lapack_complex_float) * ldaf_t * MAX(1,n) );
00100 if( af_t == NULL ) {
00101 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00102 goto exit_level_1;
00103 }
00104 b_t = (lapack_complex_float*)
00105 LAPACKE_malloc( sizeof(lapack_complex_float) *
00106 ldb_t * MAX(1,nrhs) );
00107 if( b_t == NULL ) {
00108 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00109 goto exit_level_2;
00110 }
00111 x_t = (lapack_complex_float*)
00112 LAPACKE_malloc( sizeof(lapack_complex_float) *
00113 ldx_t * MAX(1,nrhs) );
00114 if( x_t == NULL ) {
00115 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00116 goto exit_level_3;
00117 }
00118 err_bnds_norm_t = (float*)
00119 LAPACKE_malloc( sizeof(float) * nrhs * MAX(1,n_err_bnds) );
00120 if( err_bnds_norm_t == NULL ) {
00121 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00122 goto exit_level_4;
00123 }
00124 err_bnds_comp_t = (float*)
00125 LAPACKE_malloc( sizeof(float) * nrhs * MAX(1,n_err_bnds) );
00126 if( err_bnds_comp_t == NULL ) {
00127 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00128 goto exit_level_5;
00129 }
00130
00131 LAPACKE_csy_trans( matrix_order, uplo, n, a, lda, a_t, lda_t );
00132 LAPACKE_csy_trans( matrix_order, uplo, n, af, ldaf, af_t, ldaf_t );
00133 LAPACKE_cge_trans( matrix_order, n, nrhs, b, ldb, b_t, ldb_t );
00134 LAPACKE_cge_trans( matrix_order, n, nrhs, x, ldx, x_t, ldx_t );
00135
00136 LAPACK_cporfsx( &uplo, &equed, &n, &nrhs, a_t, &lda_t, af_t, &ldaf_t, s,
00137 b_t, &ldb_t, x_t, &ldx_t, rcond, berr, &n_err_bnds,
00138 err_bnds_norm_t, err_bnds_comp_t, &nparams, params,
00139 work, rwork, &info );
00140 if( info < 0 ) {
00141 info = info - 1;
00142 }
00143
00144 LAPACKE_cge_trans( LAPACK_COL_MAJOR, n, nrhs, x_t, ldx_t, x, ldx );
00145 LAPACKE_sge_trans( LAPACK_COL_MAJOR, nrhs, n_err_bnds, err_bnds_norm_t,
00146 nrhs, err_bnds_norm, nrhs );
00147 LAPACKE_sge_trans( LAPACK_COL_MAJOR, nrhs, n_err_bnds, err_bnds_comp_t,
00148 nrhs, err_bnds_comp, nrhs );
00149
00150 LAPACKE_free( err_bnds_comp_t );
00151 exit_level_5:
00152 LAPACKE_free( err_bnds_norm_t );
00153 exit_level_4:
00154 LAPACKE_free( x_t );
00155 exit_level_3:
00156 LAPACKE_free( b_t );
00157 exit_level_2:
00158 LAPACKE_free( af_t );
00159 exit_level_1:
00160 LAPACKE_free( a_t );
00161 exit_level_0:
00162 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00163 LAPACKE_xerbla( "LAPACKE_cporfsx_work", info );
00164 }
00165 } else {
00166 info = -1;
00167 LAPACKE_xerbla( "LAPACKE_cporfsx_work", info );
00168 }
00169 return info;
00170 }