PeriDyno 1.0.0
Loading...
Searching...
No Matches
SparseMatrix.inl
Go to the documentation of this file.
1#include <cuda_runtime.h>
6#include <windows.h>
7
8namespace dyno
9{
10 template <typename VarType>
12 {
13 my_A.clear();
14 my_transposedA.clear();
15 my_b.clear();
16 my_x.clear();
17 }
18
19 template <typename VarType>
20 void SparseMatrix<VarType>::assign_cgls(CArray<VarType>& s_b, std::vector<std::map<int, VarType>>& s_matrix, std::vector<std::map<int, VarType>>& s_matrix_transposed)
21 {
22 my_A.assign(s_matrix);
23 my_transposedA.assign(s_matrix_transposed);
24 my_b.assign(s_b);
25
26 my_x.resize(s_b.size());
27 my_x.reset();
28 }
29
30 template <typename VarType>
31 void SparseMatrix<VarType>::CGLS(int i_max, VarType threshold)
32 {
33 int system_size = my_b.size();
34 //printf("system size is: %d \r\n", system_size);
35
36 Arithmetic<VarType>*m_arithmetic = Arithmetic<VarType>::Create(system_size);
37
38 //x_0
39 SparseV x_0(system_size);
40 x_0.reset();
41
42 int itor = 0;
43
44 VarType delta_0 = 10, delta_new = 10, delta_old = 10;
45 SparseV b_new, temp1, temp2, my_r, my_d, my_q;
46 b_new.resize(system_size); temp1.resize(system_size); temp2.resize(system_size); my_r.resize(system_size); my_d.resize(system_size); my_q.resize(system_size);
47 b_new.reset(); temp1.reset(); temp2.reset(); my_r.reset(); my_d.reset(); my_q.reset();
48
49 //compute b_new
51
52 //compute r=b_new-transposed(A)*A*x_0
55 Function2Pt::subtract(my_r, b_new, temp2);
56
57 my_d.assign(my_r);
58
59 //compute delta
60 delta_new = m_arithmetic->Dot(my_r, my_r);
61 delta_0 = delta_new;
62 while ((itor < i_max) && (delta_new > (threshold*threshold*delta_0)))
63 {
64 //compute alpha and x(i+1)
66 VarType alpha = delta_new / m_arithmetic->Dot(my_q, my_q);
67 Function2Pt::saxpy(my_x, my_d, my_x, alpha);
68 //compute r
69 if (itor % 50 == 0)
70 {
71 //compute r=b_new-transposed(A)*A*x
72 temp1.reset(); temp2.reset();
75 Function2Pt::subtract(my_r, b_new, temp2);
76 }
77 else
78 {
79 temp1.reset();
81 Function2Pt::saxpy(my_r, temp1, my_r, -alpha);
82 }
83
84 delta_old = delta_new;
85 delta_new = m_arithmetic->Dot(my_r, my_r);
86 VarType beta = delta_new / delta_old;
87 Function2Pt::saxpy(my_d, my_d, my_r, beta);
88
89 itor++;
90 }
91 //std::printf("the iterations of CGLS is: %d \n",itor);
92 delete m_arithmetic;
93
94 x_0.clear();b_new.clear();temp1.clear();temp2.clear();my_r.clear();my_d.clear();my_q.clear();
95 }
96}
static Arithmetic * Create(int n)
T Dot(DArray< T > &xArr, DArray< T > &yArr)
void assign_cgls(CArray< VarType > &s_b, std::vector< std::map< int, VarType > > &s_matrix, std::vector< std::map< int, VarType > > &s_matrix_transposed)
void clear()
Free allocated memory. Should be called before the object is deleted.
void CGLS(int i_max, VarType threshold)
DArray< VarType > SparseV
void saxpy(DArray< T > &zArr, DArray< T > &xArr, DArray< T > &yArr, T alpha)
void subtract(DArray< T > &zArr, DArray< T > &xArr, DArray< T > &yArr)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
Array< T, DeviceType::CPU > CArray
Definition Array.h:151
void multiply_SM_by_vector(DArrayMap< VarType > &matrix_a, DArray< VarType > &a, DArray< VarType > &Aa)