KIDS  ver-0.0.1
KIDS : Kernel Integrated Dynamics Simulator
Loading...
Searching...
No Matches
sparse_utils.h
Go to the documentation of this file.
1#ifndef SPARSE_UTILS_H
2#define SPARSE_UTILS_H
3#include "definitions.h"
4
5template <class T>
6class SparseMat {
7 public:
8 enum { RowMajor, ColMajor };
9 SparseMat(T* A, const int& N, const int& M, const int& major = RowMajor) {
10 _major = major;
11 LDA = (_major == RowMajor) ? N : M;
12 _LLDA = (_major == RowMajor) ? M : N;
13 csr_LDA = new int[LDA];
14 _nallow = 0;
15 size = 0;
16 for (int i = 0; i < N; ++i) { // Rowmajor !!!
17 for (int j = 0; j < M; ++j) {
18 if (NORM_OF(A[i * M + j]) > phys::math::eps8) { Push(i, j, A[i * M + j]); }
19 }
20 }
21 Fix();
22 }
23
24 int Push(const int& n, const int& m, const T& val) {
25 if (_major == RowMajor && n >= _nallow) {
26 while (_nallow < n) {
28 _nallow++;
29 }
30 vec_val.push_back(val);
31 vec_conn.push_back(m);
32 size++;
33 // std::cout << n << " " << m << ":" << val << std::endl;
34 } else if (_major == ColMajor && m >= _nallow) {
35 exit(-1);
36 }
37 return 0;
38 }
39
40 int Fix() {
41 if (fixed) return -1;
42 fixed = true;
43 csr_conn = new int[size];
44 _val = new T[size];
45 for (int i = 0; i < size; ++i) {
46 csr_conn[i] = vec_conn[i];
47 _val[i] = vec_val[i];
48 }
49 for (int n = _nallow; n < LDA; ++n) { csr_LDA[n] = size; }
50 std::vector<int>().swap(vec_conn);
51 std::vector<T>().swap(vec_val);
52 return 0;
53 }
54
55 int MatMul(T* A, T* B) {
56 plFunction();
57 for (int i = 0; i < LDA; ++i) {
58 A[i] = (T) 0;
59 int ib = (i == 0) ? 0 : csr_LDA[i - 1];
60 int ie = csr_LDA[i];
61 for (int ic = ib; ic < ie; ++ic) { A[i] += _val[ic] * B[csr_conn[ic]]; }
62 }
63 return 0;
64 }
65
66 int Show() {
67 for (int i = 0; i < LDA; ++i) {
68 int ib = (i == 0) ? 0 : csr_LDA[i - 1];
69 int ie = csr_LDA[i];
70 std::cout << std::setprecision(3) << std::setiosflags(std::ios::scientific) << setiosflags(std::ios::left)
71 << std::setw(7);
72 int ic = ib;
73 int j = 0;
74 while (ic < ie) {
75 if (j < csr_conn[ic]) {
76 std::cout << "(X,X)\t";
77 j++;
78 } else {
79 std::cout << _val[ic] << "\t";
80 ic++;
81 j++;
82 }
83 }
84 while (j < _LLDA) {
85 std::cout << "(X,X)\t";
86 j++;
87 }
88 std::cout << std::endl;
89 }
90 return 0;
91 }
92
93 virtual ~SparseMat() {
94 delete[] csr_LDA;
95 if (fixed) { delete[] csr_conn, _val; }
96 }
97
98 private:
99 bool fixed = false;
101 int size;
106 std::vector<int> vec_conn{};
107 std::vector<T> vec_val{};
108};
109
110
111#endif // SPARSE_UTILS_H
int * csr_conn
std::vector< T > vec_val
virtual ~SparseMat()
int * csr_LDA
std::vector< int > vec_conn
int Push(const int &n, const int &m, const T &val)
int MatMul(T *A, T *B)
SparseMat(T *A, const int &N, const int &M, const int &major=RowMajor)
Definition sparse_utils.h:9
constexpr real_precision eps8
Definition phys.h:33