magma_int_t magma_d_precond( magma_d_sparse_matrix A, magma_d_vector b, magma_d_vector *x, magma_d_preconditioner precond ) { // set up precond parameters as solver parameters magma_d_solver_par psolver_par; psolver_par.epsilon = precond.epsilon; psolver_par.maxiter = precond.maxiter; psolver_par.restart = precond.restart; if( precond.solver == Magma_CG ){ // printf( "start CG preconditioner with epsilon: %f and maxiter: %d: ", // psolver_par.epsilon, psolver_par.maxiter ); magma_dcg( A, b, x, &psolver_par ); // printf( "done.\n" ); return MAGMA_SUCCESS; } if( precond.solver == Magma_GMRES ){ // printf( "start GMRES preconditioner with epsilon: %f and maxiter: %d: ", // psolver_par.epsilon, psolver_par.maxiter ); magma_dgmres( A, b, x, &psolver_par ); // printf( "done.\n" ); return MAGMA_SUCCESS; } if( precond.solver == Magma_BICGSTAB ){ // printf( "start BICGSTAB preconditioner with epsilon: %f and maxiter: %d: ", // psolver_par.epsilon, psolver_par.maxiter ); magma_dbicgstab( A, b, x, &psolver_par ); // printf( "done.\n"); return MAGMA_SUCCESS; } if( precond.solver == Magma_JACOBI ){ // printf( "start JACOBI preconditioner with epsilon: %f and maxiter: %d: ", // psolver_par.epsilon, psolver_par.maxiter ); magma_djacobi( A, b, x, &psolver_par ); // printf( "done.\n"); return MAGMA_SUCCESS; } if( precond.solver == Magma_BCSRLU ){ // printf( "start BCSRLU preconditioner with epsilon: %f and maxiter: %d: ", // psolver_par.epsilon, psolver_par.maxiter ); magma_dbcsrlu( A, b, x, &psolver_par ); // printf( "done.\n"); return MAGMA_SUCCESS; } else{ printf( "error: preconditioner type not yet supported.\n" ); return MAGMA_ERR_NOT_SUPPORTED; } }
extern "C" magma_int_t magma_d_solver( magma_d_sparse_matrix A, magma_d_vector b, magma_d_vector *x, magma_dopts *zopts, magma_queue_t queue ) { // preconditioner if ( zopts->solver_par.solver != Magma_ITERREF ) { magma_d_precondsetup( A, b, &zopts->precond_par, queue ); } switch( zopts->solver_par.solver ) { case Magma_CG: magma_dcg_res( A, b, x, &zopts->solver_par, queue );break; case Magma_CGMERGE: magma_dcg_merge( A, b, x, &zopts->solver_par, queue );break; case Magma_PCG: magma_dpcg( A, b, x, &zopts->solver_par, &zopts->precond_par, queue );break; case Magma_BICGSTAB: magma_dbicgstab( A, b, x, &zopts->solver_par, queue );break; case Magma_BICGSTABMERGE: magma_dbicgstab_merge( A, b, x, &zopts->solver_par, queue );break; case Magma_PBICGSTAB: magma_dpbicgstab( A, b, x, &zopts->solver_par, &zopts->precond_par, queue );break; case Magma_GMRES: magma_dfgmres( A, b, x, &zopts->solver_par, &zopts->precond_par, queue );break; case Magma_PGMRES: magma_dfgmres( A, b, x, &zopts->solver_par, &zopts->precond_par, queue );break; case Magma_LOBPCG: magma_dlobpcg( A, &zopts->solver_par, queue );break; case Magma_ITERREF: magma_diterref( A, b, x, &zopts->solver_par, &zopts->precond_par, queue );break; case Magma_JACOBI: magma_djacobi( A, b, x, &zopts->solver_par, queue );break; case Magma_BAITER: magma_dbaiter( A, b, x, &zopts->solver_par, queue );break; } return MAGMA_SUCCESS; }