-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcg.cpp
executable file
·83 lines (62 loc) · 1.65 KB
/
cg.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "uti.h"
#include "sparse_matrix.h"
#include "sparse_matrix_transpose.h"
#define MinResidue 0.0000001
#define MAX_ITR 100
int CG_ITS = 0;
void cg(double x[], double Phi[], double s[])
{
double r[L],p_res[L],MV[L],MMV[L];
double beta1,rsold,rsnew,alpha1,denom;
int i,l;
for (i=0 ; i < L ; i++)
{
s[i] = 0.0; // initial guess
}
//return;
sparse_matrix(x,s,MV);
sparse_matrix_transpose(x,MV,MMV);
for(i=0; i<L; i++)
{
r[i] = Phi[i] - MMV[i];
p_res[i] = r[i];
}
rsold=0.0;
for(i=0; i<L; i++)
{
rsold += r[i]*r[i];
}
for(l=0; l<MAX_ITR; l++)
{
CG_ITS++ ;
sparse_matrix(x,p_res,MV);
sparse_matrix_transpose(x,MV,MMV);
denom=0.0;
for(i=0; i<L; i++)
{
denom += p_res[i]*MMV[i];
}
alpha1 = rsold/denom;
for(i=0; i<L; i++)
{
s[i] = s[i] + alpha1*p_res[i];
r[i] = r[i] - alpha1*MMV[i];
}
rsnew = 0;
for(i=0; i<L; i++)
{
rsnew += r[i]*r[i];
}
beta1 = rsnew / rsold ;
//std::cout << "Residue_New : " << rsnew << std::endl ;
for(i=0; i<L; i++)
{ p_res[i] = r[i] + beta1*p_res[i]; }
rsold = rsnew;
if(sqrt(rsnew) < MinResidue) {
//std::cout << " CG_ITERATIONS** : " << CG_ITS << std::endl ;
return;
}
}
std::cout << "CG did not converge : Res is " << sqrt(rsnew) << " " << std::endl; // This should ideally be never printed //
return;
}