In this example we show how one can use the iterative solvers in ViennaCL with objects from Boost.uBLAS.
The first step is to include the necessary headers:
#include <iostream>
#ifndef NDEBUG
#define BOOST_UBLAS_NDEBUG
#endif
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/triangular.hpp>
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/matrix_proxy.hpp>
#include <boost/numeric/ublas/operation.hpp>
#include <boost/numeric/ublas/operation_sparse.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/lu.hpp>
#define VIENNACL_WITH_UBLAS 1
A shortcut for convience (use ublas::
instead of boost::numeric::ublas::
)
using namespace boost::numeric;
In the main() routine we create matrices and vectors using Boost.uBLAS types, fill them with data and launch the iterative solvers.
{
ublas::vector<ScalarType> rhs;
ublas::vector<ScalarType> ref_result;
ublas::vector<ScalarType> result;
ublas::compressed_matrix<ScalarType> ublas_matrix;
Read system from matrix-market file
{
std::cout << "Error reading Matrix file" << std::endl;
return EXIT_FAILURE;
}
Read associated vectors from files
{
std::cout << "Error reading RHS file" << std::endl;
return EXIT_FAILURE;
}
{
std::cout << "Error reading Result file" << std::endl;
return EXIT_FAILURE;
}
Set up ILUT preconditioners for ViennaCL and ublas objects. Other preconditioners can also be used, see Preconditioners
First we run an conjugate gradient solver with different preconditioners:
std::cout << "----- CG Test -----" << std::endl;
std::cout <<
"Residual norm: " <<
norm_2(
prod(ublas_matrix, result) - rhs) << std::endl;
std::cout <<
"Residual norm: " <<
norm_2(
prod(ublas_matrix, result) - rhs) << std::endl;
std::cout <<
"Residual norm: " <<
norm_2(
prod(ublas_matrix, result) - rhs) << std::endl;
std::cout <<
"Residual norm: " <<
norm_2(
prod(ublas_matrix, result) - rhs) << std::endl;
Run the stabilized BiConjugate gradient solver without and with preconditioners (ILUT, ILU0)
std::cout << "----- BiCGStab Test -----" << std::endl;
Run the generalized minimum residual method witout and with preconditioners (ILUT, ILU0):
std::cout << "----- GMRES Test -----" << std::endl;
That's it.
std::cout << "!!!! TUTORIAL COMPLETED SUCCESSFULLY !!!!" << std::endl;
return EXIT_SUCCESS;
}
Full Example Code
#include <iostream>
#ifndef NDEBUG
#define BOOST_UBLAS_NDEBUG
#endif
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/triangular.hpp>
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/matrix_proxy.hpp>
#include <boost/numeric/ublas/operation.hpp>
#include <boost/numeric/ublas/operation_sparse.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/lu.hpp>
#define VIENNACL_WITH_UBLAS 1
using namespace boost::numeric;
{
ublas::vector<ScalarType> rhs;
ublas::vector<ScalarType> ref_result;
ublas::vector<ScalarType> result;
ublas::compressed_matrix<ScalarType> ublas_matrix;
{
std::cout << "Error reading Matrix file" << std::endl;
return EXIT_FAILURE;
}
{
std::cout << "Error reading RHS file" << std::endl;
return EXIT_FAILURE;
}
{
std::cout << "Error reading Result file" << std::endl;
return EXIT_FAILURE;
}
std::cout << "----- CG Test -----" << std::endl;
std::cout <<
"Residual norm: " <<
norm_2(
prod(ublas_matrix, result) - rhs) << std::endl;
std::cout <<
"Residual norm: " <<
norm_2(
prod(ublas_matrix, result) - rhs) << std::endl;
std::cout <<
"Residual norm: " <<
norm_2(
prod(ublas_matrix, result) - rhs) << std::endl;
std::cout <<
"Residual norm: " <<
norm_2(
prod(ublas_matrix, result) - rhs) << std::endl;
std::cout << "----- BiCGStab Test -----" << std::endl;
std::cout << "----- GMRES Test -----" << std::endl;
std::cout << "!!!! TUTORIAL COMPLETED SUCCESSFULLY !!!!" << std::endl;
return EXIT_SUCCESS;
}