Advertisement
Guest User

Untitled

a guest
Mar 25th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <vector>
  5. #include <type_traits>
  6. #include <suitesparse/umfpack.h>
  7.  
  8. class Sparse
  9. {
  10. private:
  11.     std::vector<double> Ax;
  12.     std::vector<int> Ai, Ap;
  13.     int size;
  14.  
  15.     template<typename T>
  16.     void parse(std::ifstream & file, std::vector<T> &vec);
  17. public:
  18.     Sparse(std::string filename);
  19.     std::vector<double> solve(std::vector<double> & right, int sys);
  20.     int get_size() const;
  21. };
  22.  
  23.  
  24.  
  25. int main()
  26. {
  27.     Sparse lel("kek");
  28.     std::vector<double> b = {8, 45, -3, 3, 19};
  29.     auto res = lel.solve(b, UMFPACK_A);
  30.     for(auto i: res)
  31.         std::cout << i << std::endl;
  32.     return 0;
  33. }
  34.  
  35. template<typename T>
  36. void Sparse::parse(std::ifstream & file, std::vector<T> &vec)
  37. {
  38.     std::string line;
  39.     size_t elem_num;
  40.  
  41.     if (std::is_same<T, double>::value)
  42.         elem_num = 3;
  43.     else
  44.         elem_num = 7;
  45.  
  46.     T tmp;
  47.     size_t readed = 0;
  48.  
  49.     while(1)
  50.     {
  51.         getline(file, line);
  52.         std::istringstream iss(line);
  53.  
  54.         while((iss >> tmp))
  55.         {
  56.             vec.push_back(tmp);
  57.             readed++;
  58.         }
  59.  
  60.         if (readed != elem_num)
  61.             break;
  62.         else
  63.             readed = 0;
  64.     }
  65. }
  66.  
  67. Sparse::Sparse(std::string filename)
  68. {
  69.     std::ifstream file(filename);
  70.  
  71.     std::string line;
  72.     getline(file, line);
  73.     std::istringstream iss(line);
  74.     iss >> size;
  75.  
  76.     parse(file, Ap);
  77.     parse(file, Ai);
  78.     parse(file, Ax);
  79.  
  80.     std::cout << "Sparse matrix created!" << std::endl;
  81. }
  82. std::vector<double> Sparse::solve(std::vector<double> & right, int sys)
  83. {
  84.     void *Symbolic, *Numeric;
  85.     int *Ap = &(this->Ap)[0];
  86.     int *Ai = &(this->Ai)[0];
  87.     double *Ax = &(this->Ax)[0];
  88.  
  89.  
  90.     umfpack_di_symbolic(size, size, Ap, Ai, Ax, &Symbolic, NULL, NULL);
  91.     std::cout << "Symbolic done!" << std::endl;
  92.  
  93.  
  94.     umfpack_di_numeric(Ap, Ai, Ax, Symbolic, &Numeric, NULL, NULL);
  95.     std::cout << "Numeric done!" << std::endl;
  96.     umfpack_di_free_symbolic(&Symbolic);
  97.  
  98.  
  99.     std::vector<double> result(size);
  100.     double *x = &result[0];
  101.     double *b = &right[0];
  102.  
  103.  
  104.     umfpack_di_solve(sys, Ap, Ai, Ax, x, b, Numeric, NULL, NULL);
  105.     std::cout << "Solve done!" << std::endl;
  106.     umfpack_di_free_numeric(&Numeric);
  107.  
  108.     return result;
  109. }
  110.  
  111. int Sparse::get_size() const
  112. {
  113.     return size;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement