extern "C" magma_int_t magma_c_applyprecond_right( magma_c_sparse_matrix A, magma_c_vector b, magma_c_vector *x, magma_c_preconditioner *precond, magma_queue_t queue ) { // set queue for old dense routines magma_queue_t orig_queue; magmablasGetKernelStream( &orig_queue ); if ( precond->solver == Magma_JACOBI ) { magma_ccopy( b.num_rows*b.num_cols, b.dval, 1, x->dval, 1 ); // x = b } else if ( precond->solver == Magma_ILU || ( precond->solver == Magma_AILU && precond->maxiter == -1)) { magma_capplycumilu_r( b, x, precond, queue ); } else if ( precond->solver == Magma_ICC || ( precond->solver == Magma_AICC && precond->maxiter == -1) ) { magma_capplycumicc_r( b, x, precond, queue ); } else if ( precond->solver == Magma_NONE ) { magma_ccopy( b.num_rows*b.num_cols, b.dval, 1, x->dval, 1 ); // x = b } else if ( precond->solver == Magma_FUNCTION ) { magma_capplycustomprecond_r( b, x, precond, queue ); } else { printf( "error: preconditioner type not yet supported.\n" ); magmablasSetKernelStream( orig_queue ); return MAGMA_ERR_NOT_SUPPORTED; } magmablasSetKernelStream( orig_queue ); return MAGMA_SUCCESS; }
extern "C" magma_int_t magma_c_applyprecond_right( magma_trans_t trans, magma_c_matrix A, magma_c_matrix b, magma_c_matrix *x, magma_c_preconditioner *precond, magma_queue_t queue ) { magma_int_t info = 0; if( trans == MagmaNoTrans ) { if ( precond->solver == Magma_JACOBI ) { magma_ccopy( b.num_rows*b.num_cols, b.dval, 1, x->dval, 1, queue ); // x = b } else if ( ( precond->solver == Magma_ILU || precond->solver == Magma_AILU ) && precond->maxiter >= 50 ) { CHECK( magma_capplycumilu_r( b, x, precond, queue )); } else if ( ( precond->solver == Magma_ILU || precond->solver == Magma_AILU ) && precond->maxiter < 50 ) { magma_ccopy( b.num_rows*b.num_cols, b.dval, b.num_cols, x->dval, b.num_cols, queue ); magma_c_solver_par solver_par; solver_par.maxiter = precond->maxiter; magma_cjacobiiter_sys( precond->U, b, precond->d2, precond->work2, x, &solver_par, queue ); // CHECK( magma_cjacobispmvupdate_bw(precond->maxiter, precond->U, precond->work2, b, precond->d2, x, queue )); } else if ( ( precond->solver == Magma_ICC || precond->solver == Magma_AICC ) && precond->maxiter >= 50 ) { CHECK( magma_capplycumicc_r( b, x, precond, queue )); } else if ( ( precond->solver == Magma_ICC || precond->solver == Magma_AICC ) && precond->maxiter < 50 ) { magma_ccopy( b.num_rows*b.num_cols, b.dval, b.num_cols, x->dval, b.num_cols, queue ); magma_c_solver_par solver_par; solver_par.maxiter = precond->maxiter; magma_cjacobiiter_sys( precond->U, b, precond->d2, precond->work2, x, &solver_par, queue ); // CHECK( magma_cjacobispmvupdate_bw(precond->maxiter, precond->U, precond->work2, b, precond->d2, x, queue )); } else if ( precond->solver == Magma_NONE ) { magma_ccopy( b.num_rows*b.num_cols, b.dval, 1, x->dval, 1, queue ); // x = b } else if ( precond->solver == Magma_FUNCTION ) { CHECK( magma_capplycustomprecond_r( b, x, precond, queue )); } else { printf( "error: preconditioner type not yet supported.\n" ); info = MAGMA_ERR_NOT_SUPPORTED; } } else if ( trans == MagmaTrans ){ if ( precond->solver == Magma_JACOBI ) { magma_ccopy( b.num_rows*b.num_cols, b.dval, 1, x->dval, 1, queue ); // x = b } else if ( ( precond->solver == Magma_ILU || precond->solver == Magma_AILU ) && precond->maxiter >= 50 ) { CHECK( magma_capplycumilu_r_transpose( b, x, precond, queue )); } else if ( ( precond->solver == Magma_ILU || precond->solver == Magma_AILU ) && precond->maxiter < 50 ) { magma_ccopy( b.num_rows*b.num_cols, b.dval, b.num_cols, x->dval, b.num_cols, queue ); magma_c_solver_par solver_par; solver_par.maxiter = precond->maxiter; magma_cjacobiiter_sys( precond->UT, b, precond->d2, precond->work2, x, &solver_par, queue ); // CHECK( magma_cjacobispmvupdate_bw(precond->maxiter, precond->U, precond->work2, b, precond->d2, x, queue )); } else if ( ( precond->solver == Magma_ICC || precond->solver == Magma_AICC ) && precond->maxiter >= 50 ) { CHECK( magma_capplycumicc_r( b, x, precond, queue )); } else if ( ( precond->solver == Magma_ICC || precond->solver == Magma_AICC ) && precond->maxiter < 50 ) { magma_ccopy( b.num_rows*b.num_cols, b.dval, b.num_cols, x->dval, b.num_cols, queue ); magma_c_solver_par solver_par; solver_par.maxiter = precond->maxiter; magma_cjacobiiter_sys( precond->UT, b, precond->d2, precond->work2, x, &solver_par, queue ); // CHECK( magma_cjacobispmvupdate_bw(precond->maxiter, precond->U, precond->work2, b, precond->d2, x, queue )); } else if ( precond->solver == Magma_NONE ) { magma_ccopy( b.num_rows*b.num_cols, b.dval, 1, x->dval, 1, queue ); // x = b } else if ( precond->solver == Magma_FUNCTION ) { CHECK( magma_capplycustomprecond_r( b, x, precond, queue )); } else { printf( "error: preconditioner type not yet supported.\n" ); info = MAGMA_ERR_NOT_SUPPORTED; } } cleanup: return info; }