Advertisement
jomega_ai

amgx_ilu_solver.cpp

Apr 7th, 2025 (edited)
342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.11 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <amgx_c.h>
  5. #include "mmio.h"
  6.  
  7. void read_matrix_market_A(const char* filename, std::vector<int>& row, std::vector<int>& col, std::vector<double>& val,
  8.                           int &n, int &nnz) {
  9.     FILE* f = fopen(filename, "r");
  10.     MM_typecode matcode;
  11.     mm_read_banner(f, &matcode);
  12.     int m, k;
  13.     mm_read_mtx_crd_size(f, &m, &k, &nnz);
  14.     n = m;
  15.     row.resize(nnz);
  16.     col.resize(nnz);
  17.     val.resize(nnz);
  18.     for (int i = 0; i < nnz; ++i) {
  19.         int r, c;
  20.         double v;
  21.         fscanf(f, "%d %d %lf", &r, &c, &v);
  22.         row[i] = r - 1;
  23.         col[i] = c - 1;
  24.         val[i] = v;
  25.     }
  26.     fclose(f);
  27. }
  28.  
  29. void read_vector_b(const char* filename, std::vector<double>& b, int &n) {
  30.     FILE* f = fopen(filename, "r");
  31.     MM_typecode matcode;
  32.     mm_read_banner(f, &matcode);
  33.     int m, cols;
  34.     fscanf(f, "%d %d", &m, &cols);
  35.     n = m;
  36.     b.resize(n);
  37.     for (int i = 0; i < n; ++i) {
  38.         fscanf(f, "%lf", &b[i]);
  39.     }
  40.     fclose(f);
  41. }
  42.  
  43. int main() {
  44.     AMGX_config_handle cfg;
  45.     AMGX_resources_handle rsrc;
  46.     AMGX_matrix_handle A;
  47.     AMGX_vector_handle x, b;
  48.  
  49.     // Init
  50.     AMGX_initialize();
  51.     AMGX_config_create_from_file(&cfg, "solver_config.json");
  52.     AMGX_resources_create_simple(&rsrc, cfg);
  53.  
  54.     // Read matrix
  55.     std::vector<int> row, col;
  56.     std::vector<double> val;
  57.     int n, nnz;
  58.     read_matrix_market_A("A.mtx", row, col, val, n, nnz);
  59.  
  60.     // Read RHS
  61.     std::vector<double> b_vec;
  62.     int rhs_len;
  63.     read_vector_b("b.mtx", b_vec, rhs_len);
  64.  
  65.     // Create matrix and vectors
  66.     AMGX_vector_create(&x, rsrc, AMGX_mode_dDDI);
  67.     AMGX_vector_create(&b, rsrc, AMGX_mode_dDDI);
  68.     AMGX_matrix_create(&A, rsrc, AMGX_mode_dDDI);
  69.  
  70.     // Upload system
  71.     AMGX_matrix_upload_all(A, n, nnz, 1, 1, row.data(), col.data(), val.data(), NULL);
  72.  
  73.     AMGX_vector_upload(b, n, 1, b_vec.data());
  74.     std::vector<double> x_vec(n, 0.0);
  75.     AMGX_vector_upload(x, n, 1, x_vec.data());
  76.  
  77.     // Create solver and solve
  78.     AMGX_solver_handle solver;
  79.     AMGX_solver_create(&solver, rsrc, AMGX_mode_dDDI, cfg);
  80.     AMGX_solver_setup(solver, A);
  81.     AMGX_solver_solve(solver, b, x);
  82.     AMGX_SOLVE_STATUS status;
  83.     AMGX_solver_get_status(solver, &status);
  84.  
  85.     if (status != AMGX_SOLVE_SUCCESS)
  86.     {
  87.         std::cerr << "❌ AMGX solve failed. Status code: " << status << std::endl;
  88.     }
  89.     else
  90.     {
  91.         std::cout << "✅ AMGX solve succeeded." << std::endl;
  92.     }
  93.  
  94.     // Download solution
  95.     AMGX_vector_download(x, x_vec.data());
  96.  
  97.     std::ofstream out("solution.mtx");
  98.     out << "%%MatrixMarket matrix array real general\n";
  99.     out << n << " 1\n";
  100.     for (int i = 0; i < n; ++i)
  101.         out << x_vec[i] << "\n";
  102.     out.close();
  103.  
  104.     std::cout << "Solved Ax = b and the solution written to solution.mtx\n";
  105.  
  106.     // Cleanup
  107.     AMGX_solver_destroy(solver);
  108.     AMGX_vector_destroy(x);
  109.     AMGX_vector_destroy(b);
  110.     AMGX_matrix_destroy(A);
  111.     AMGX_resources_destroy(rsrc);
  112.     AMGX_config_destroy(cfg);
  113.     AMGX_finalize();
  114.     return 0;
  115. }
  116.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement