extern "C" magma_int_t magma_c_applyprecond_left( 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_cjacobi_diagscal( A.num_rows, precond->d, b, x, queue ); } else if ( precond->solver == Magma_ILU || ( precond->solver == Magma_AILU && precond->maxiter == -1) ) { magma_capplycumilu_l( b, x, precond, queue ); } else if ( precond->solver == Magma_ICC ) { magma_capplycumicc_l( 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 { printf( "error: preconditioner type not yet supported.\n" ); magmablasSetKernelStream( orig_queue ); return MAGMA_ERR_NOT_SUPPORTED; } magmablasSetKernelStream( orig_queue ); return MAGMA_SUCCESS; }
magma_int_t magma_c_applyprecond_left( magma_c_sparse_matrix A, magma_c_vector b, magma_c_vector *x, magma_c_preconditioner *precond ) { if( precond->solver == Magma_JACOBI ){ magma_cjacobi_diagscal( A.num_rows, precond->d.val, b.val, x->val ); return MAGMA_SUCCESS; } else if( precond->solver == Magma_ILU ){ magma_capplycuilu_l( b, x, precond ); return MAGMA_SUCCESS; } else if( precond->solver == Magma_AILU ){ magma_capplycuilu_l( b, x, precond ); // magma_capplyailu_l( b, x, precond ); return MAGMA_SUCCESS; } else if( precond->solver == Magma_ICC ){ //magma_capplycuilu_l( b, x, precond ); magma_capplycuicc_l( b, x, precond ); return MAGMA_SUCCESS; } else if( precond->solver == Magma_AICC ){ //magma_capplycuilu_l( b, x, precond ); magma_capplycuicc_l( b, x, precond ); return MAGMA_SUCCESS; } else{ printf( "error: preconditioner type not yet supported.\n" ); return MAGMA_ERR_NOT_SUPPORTED; } }
magma_int_t magma_c_applyprecond( magma_c_sparse_matrix A, magma_c_vector b, magma_c_vector *x, magma_c_preconditioner *precond ) { if( precond->solver == Magma_JACOBI ){ magma_cjacobi_diagscal( A.num_rows, precond->d.val, b.val, x->val ); return MAGMA_SUCCESS; } else if( precond->solver == Magma_PASTIX ){ magma_capplypastix( b, x, precond ); return MAGMA_SUCCESS; } else if( precond->solver == Magma_ILU ){ magma_c_vector tmp; magma_c_vinit( &tmp, Magma_DEV, A.num_rows, MAGMA_C_MAKE(1.0, 0.0) ); // magma_capplycuilu_l( b, &tmp, precond ); // magma_capplycuilu_r( tmp, x, precond ); magma_c_vfree( &tmp ); return MAGMA_SUCCESS; } else if( precond->solver == Magma_ICC ){ magma_c_vector tmp; magma_c_vinit( &tmp, Magma_DEV, A.num_rows, MAGMA_C_MAKE(1.0, 0.0) ); // magma_ctrisv_l_nu( precond->L, b, &tmp ); // magma_ctrisv_r_nu( precond->L, tmp, x ); magma_c_vfree( &tmp ); return MAGMA_SUCCESS; } else{ printf( "error: preconditioner type not yet supported.\n" ); return MAGMA_ERR_NOT_SUPPORTED; } }
extern "C" magma_int_t magma_c_applyprecond( 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_cjacobi_diagscal( A.num_rows, precond->d, b, x, queue ); } else if ( precond->solver == Magma_PASTIX ) { magma_capplypastix( b, x, precond, queue ); } else if ( precond->solver == Magma_ILU ) { magma_c_vector tmp; magma_c_vinit( &tmp, Magma_DEV, A.num_rows, MAGMA_C_ZERO, queue ); magma_c_vfree( &tmp, queue ); } else if ( precond->solver == Magma_ICC ) { magma_c_vector tmp; magma_c_vinit( &tmp, Magma_DEV, A.num_rows, MAGMA_C_ZERO, queue ); magma_c_vfree( &tmp, queue ); } else if ( precond->solver == Magma_NONE ) { magma_ccopy( b.num_rows, b.dval, 1, x->dval, 1 ); // x = b } 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( 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; magma_c_matrix tmp={Magma_CSR}; if ( precond->solver == Magma_JACOBI ) { CHECK( magma_cjacobi_diagscal( b.num_rows, precond->d, b, x, queue )); } else if ( precond->solver == Magma_PASTIX ) { //CHECK( magma_capplypastix( b, x, precond, queue )); info = MAGMA_ERR_NOT_SUPPORTED; } else if ( precond->solver == Magma_ILU ) { CHECK( magma_cvinit( &tmp, Magma_DEV, b.num_rows, b.num_cols, MAGMA_C_ZERO, queue )); } else if ( precond->solver == Magma_ICC ) { CHECK( magma_cvinit( &tmp, Magma_DEV, b.num_rows, b.num_cols, MAGMA_C_ZERO, 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 { printf( "error: preconditioner type not yet supported.\n" ); info = MAGMA_ERR_NOT_SUPPORTED; } cleanup: magma_cmfree( &tmp, queue ); return info; }
extern "C" magma_int_t magma_c_applyprecond_left( 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 ) { CHECK( magma_cjacobi_diagscal( b.num_rows, precond->d, b, x, queue )); } else if ( ( precond->solver == Magma_ILU || precond->solver == Magma_AILU ) && precond->maxiter >= 50 ) { CHECK( magma_capplycumilu_l( 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->L, b, precond->d, precond->work1, x, &solver_par, queue ); // CHECK( magma_cjacobispmvupdate(precond->maxiter, precond->L, precond->work1, b, precond->d, x, queue )); } else if ( ( precond->solver == Magma_ICC || precond->solver == Magma_AICC ) && precond->maxiter >= 50 ) { CHECK( magma_capplycumicc_l( 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->L, b, precond->d, precond->work1, x, &solver_par, queue ); // CHECK( magma_cjacobispmvupdate(precond->maxiter, precond->L, precond->work1, b, precond->d, 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_l( 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 ) { CHECK( magma_cjacobi_diagscal( b.num_rows, precond->d, b, x, queue )); } else if ( ( precond->solver == Magma_ILU || precond->solver == Magma_AILU ) && precond->maxiter >= 50 ) { CHECK( magma_capplycumilu_l_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->LT, b, precond->d, precond->work1, x, &solver_par, queue ); // CHECK( magma_cjacobispmvupdate(precond->maxiter, precond->L, precond->work1, b, precond->d, x, queue )); } else if ( ( precond->solver == Magma_ICC || precond->solver == Magma_AICC ) && precond->maxiter >= 50 ) { CHECK( magma_capplycumicc_l( 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->LT, b, precond->d, precond->work1, x, &solver_par, queue ); // CHECK( magma_cjacobispmvupdate(precond->maxiter, precond->L, precond->work1, b, precond->d, 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_l( b, x, precond, queue )); } else { printf( "error: preconditioner type not yet supported.\n" ); info = MAGMA_ERR_NOT_SUPPORTED; } } else { printf( "error: preconditioner type not yet supported.\n" ); info = MAGMA_ERR_NOT_SUPPORTED; } cleanup: return info; }