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_zgbrfsx_work( int matrix_order, char trans, char equed,
00038 lapack_int n, lapack_int kl, lapack_int ku,
00039 lapack_int nrhs,
00040 const lapack_complex_double* ab,
00041 lapack_int ldab,
00042 const lapack_complex_double* afb,
00043 lapack_int ldafb, const lapack_int* ipiv,
00044 const double* r, const double* c,
00045 const lapack_complex_double* b, lapack_int ldb,
00046 lapack_complex_double* x, lapack_int ldx,
00047 double* rcond, double* berr,
00048 lapack_int n_err_bnds, double* err_bnds_norm,
00049 double* err_bnds_comp, lapack_int nparams,
00050 double* params, lapack_complex_double* work,
00051 double* rwork )
00052 {
00053 lapack_int info = 0;
00054 if( matrix_order == LAPACK_COL_MAJOR ) {
00055
00056 LAPACK_zgbrfsx( &trans, &equed, &n, &kl, &ku, &nrhs, ab, &ldab, afb,
00057 &ldafb, ipiv, r, c, b, &ldb, x, &ldx, rcond, berr,
00058 &n_err_bnds, err_bnds_norm, err_bnds_comp, &nparams,
00059 params, work, rwork, &info );
00060 if( info < 0 ) {
00061 info = info - 1;
00062 }
00063 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00064 lapack_int ldab_t = MAX(1,kl+ku+1);
00065 lapack_int ldafb_t = MAX(1,2*kl+ku+1);
00066 lapack_int ldb_t = MAX(1,n);
00067 lapack_int ldx_t = MAX(1,n);
00068 lapack_complex_double* ab_t = NULL;
00069 lapack_complex_double* afb_t = NULL;
00070 lapack_complex_double* b_t = NULL;
00071 lapack_complex_double* x_t = NULL;
00072 double* err_bnds_norm_t = NULL;
00073 double* err_bnds_comp_t = NULL;
00074
00075 if( ldab < n ) {
00076 info = -9;
00077 LAPACKE_xerbla( "LAPACKE_zgbrfsx_work", info );
00078 return info;
00079 }
00080 if( ldafb < n ) {
00081 info = -11;
00082 LAPACKE_xerbla( "LAPACKE_zgbrfsx_work", info );
00083 return info;
00084 }
00085 if( ldb < nrhs ) {
00086 info = -16;
00087 LAPACKE_xerbla( "LAPACKE_zgbrfsx_work", info );
00088 return info;
00089 }
00090 if( ldx < nrhs ) {
00091 info = -18;
00092 LAPACKE_xerbla( "LAPACKE_zgbrfsx_work", info );
00093 return info;
00094 }
00095
00096 ab_t = (lapack_complex_double*)
00097 LAPACKE_malloc( sizeof(lapack_complex_double) * ldab_t * MAX(1,n) );
00098 if( ab_t == NULL ) {
00099 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00100 goto exit_level_0;
00101 }
00102 afb_t = (lapack_complex_double*)
00103 LAPACKE_malloc( sizeof(lapack_complex_double) *
00104 ldafb_t * MAX(1,n) );
00105 if( afb_t == NULL ) {
00106 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00107 goto exit_level_1;
00108 }
00109 b_t = (lapack_complex_double*)
00110 LAPACKE_malloc( sizeof(lapack_complex_double) *
00111 ldb_t * MAX(1,nrhs) );
00112 if( b_t == NULL ) {
00113 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00114 goto exit_level_2;
00115 }
00116 x_t = (lapack_complex_double*)
00117 LAPACKE_malloc( sizeof(lapack_complex_double) *
00118 ldx_t * MAX(1,nrhs) );
00119 if( x_t == NULL ) {
00120 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00121 goto exit_level_3;
00122 }
00123 err_bnds_norm_t = (double*)
00124 LAPACKE_malloc( sizeof(double) * nrhs * MAX(1,n_err_bnds) );
00125 if( err_bnds_norm_t == NULL ) {
00126 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00127 goto exit_level_4;
00128 }
00129 err_bnds_comp_t = (double*)
00130 LAPACKE_malloc( sizeof(double) * nrhs * MAX(1,n_err_bnds) );
00131 if( err_bnds_comp_t == NULL ) {
00132 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00133 goto exit_level_5;
00134 }
00135
00136 LAPACKE_zgb_trans( matrix_order, n, n, kl, ku, ab, ldab, ab_t, ldab_t );
00137 LAPACKE_zgb_trans( matrix_order, n, n, kl, kl+ku, afb, ldafb, afb_t,
00138 ldafb_t );
00139 LAPACKE_zge_trans( matrix_order, n, nrhs, b, ldb, b_t, ldb_t );
00140 LAPACKE_zge_trans( matrix_order, n, nrhs, x, ldx, x_t, ldx_t );
00141
00142 LAPACK_zgbrfsx( &trans, &equed, &n, &kl, &ku, &nrhs, ab_t, &ldab_t,
00143 afb_t, &ldafb_t, ipiv, r, c, b_t, &ldb_t, x_t, &ldx_t,
00144 rcond, berr, &n_err_bnds, err_bnds_norm_t,
00145 err_bnds_comp_t, &nparams, params, work, rwork, &info );
00146 if( info < 0 ) {
00147 info = info - 1;
00148 }
00149
00150 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, nrhs, x_t, ldx_t, x, ldx );
00151 LAPACKE_dge_trans( LAPACK_COL_MAJOR, nrhs, n_err_bnds, err_bnds_norm_t,
00152 nrhs, err_bnds_norm, nrhs );
00153 LAPACKE_dge_trans( LAPACK_COL_MAJOR, nrhs, n_err_bnds, err_bnds_comp_t,
00154 nrhs, err_bnds_comp, nrhs );
00155
00156 LAPACKE_free( err_bnds_comp_t );
00157 exit_level_5:
00158 LAPACKE_free( err_bnds_norm_t );
00159 exit_level_4:
00160 LAPACKE_free( x_t );
00161 exit_level_3:
00162 LAPACKE_free( b_t );
00163 exit_level_2:
00164 LAPACKE_free( afb_t );
00165 exit_level_1:
00166 LAPACKE_free( ab_t );
00167 exit_level_0:
00168 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00169 LAPACKE_xerbla( "LAPACKE_zgbrfsx_work", info );
00170 }
00171 } else {
00172 info = -1;
00173 LAPACKE_xerbla( "LAPACKE_zgbrfsx_work", info );
00174 }
00175 return info;
00176 }