#include <vector>#include <iostream>
#include <amgcl/backend/builtin.hpp>#include <amgcl/adapter/crs_tuple.hpp>#include <amgcl/make_solver.hpp>#include <amgcl/amg.hpp>#include <amgcl/coarsening/smoothed_aggregation.hpp>#include <amgcl/relaxation/spai0.hpp>#include <amgcl/solver/bicgstab.hpp>
#include <amgcl/io/mm.hpp>#include <amgcl/profiler.hpp>
int main(int argc, char *argv[]) {if (argc < 3) {std::cerr << "Usage: " << argv[0] << " <matrix.mtx> <rhs.mtx>" << std::endl;return 1;}
amgcl::profiler<> prof("poisson3Db");
ptrdiff_t rows, cols;std::vector<ptrdiff_t> ptr, col;std::vector<double> val, rhs;
prof.tic("read");std::tie(rows, cols) = amgcl::io::mm_reader(argv[1])(ptr, col, val);std::cout << "Matrix " << argv[1] << ": " << rows << "x" << cols << std::endl;
std::tie(rows, cols) = amgcl::io::mm_reader(argv[2])(rhs);std::cout << "RHS " << argv[2] << ": " << rows << "x" << cols << std::endl;prof.toc("read");
auto A = std::tie(rows, ptr, col, val);
typedef amgcl::backend::builtin<double> SBackend;#ifdef MIXED_PRECISIONtypedef amgcl::backend::builtin<float> PBackend;#elsetypedef amgcl::backend::builtin<double> PBackend;#endif
typedef amgcl::make_solver<amgcl::amg<PBackend,amgcl::coarsening::smoothed_aggregation,amgcl::relaxation::spai0>,amgcl::solver::bicgstab<SBackend>> Solver;
prof.tic("setup");Solver solve(A);prof.toc("setup");
std::cout << solve << std::endl;
int iters;double error;std::vector<double> x(rows, 0.0);
prof.tic("solve");std::tie(iters, error) = solve(A, rhs, x);prof.toc("solve");
std::cout << "Iters: " << iters << std::endl<< "Error: " << error << std::endl<< prof << std::endl;}