PolynomialExpansion: 2x2caseWithoutLoop.cvl

File 2x2caseWithoutLoop.cvl, 3.1 KB (added by sili, 10 years ago)

CG 2x2 case without loop

Line 
1#ifdef _CIVL
2#include <civlc.cvh>
3#endif
4#include <stdio.h>
5#define n 2
6
7$input double a1,a2,a3;
8$input double b[n];
9double x[n];
10double xcg[n];
11
12void cg(double A[n][n], double b[n], double x[n], int steps) {
13 double r[n];
14 double p[n];
15 double temp[n];
16 double tempp[n];
17 double rsold;
18 double rsnew;
19 double rsfrac;
20 double alpha;
21
22 for(int i=0; i<n; i++) x[i] = 0;
23 for(int i=0; i<n; i++) {
24 temp[i] = 0.0;
25 for(int j=0; j<n; j++) {
26 temp[i] += A[i][j]*x[j];
27 }
28 } // Step 1
29 for(int i=0; i<n; i++) {
30 r[i] = b[i] -temp[i];
31 printf("\n===Residual vector r[%d] is: %f\n", i, r[i] );
32 }
33 rsold = 0.0;
34 for(int i=0; i<n; i++) {
35 rsold += r[i]*r[i];
36 }
37 for(int i=0; i<n; i++) {
38 p[i] = r[i];
39 }
40
41 //first loop, i == 0;
42 for(int i=0; i<n; i++) {
43 temp[i] = 0.0;
44 for(int j=0; j<n; j++) {
45 temp[i] += A[i][j]*p[j];
46 }
47 }
48 alpha = 0.0;
49 for(int i=0; i<n; i++) {
50 alpha += p[i]*temp[i];
51 }
52 printf("\n===alphaDenom is: %f\n", alpha);
53
54#ifdef _CIVL
55 $assume(alpha !=0);
56#endif
57 alpha = rsold/alpha; //Step 2
58 printf("\n===Scalar alpha is: %f\n", alpha);
59 for(int i=0; i<n; i++) {
60 tempp[i] = r[i] -alpha*temp[i]; //Step 3
61 printf("\n===tempp[%d] is: %f\n", i, tempp[i]);
62 }
63
64 for(int i=0; i<n; i++) {
65 r[i] = tempp[i];
66 }
67
68 for(int i=0; i<n; i++) {
69 tempp[i] = x[i] +alpha*p[i]; //Step 4
70 }
71
72 for(int i=0; i<n; i++) {
73 x[i] = tempp[i];
74 printf("\n===x[%d] is: %f\n", i, x[i]);
75 }
76
77 rsnew = 0.0;
78 for(int i=0; i<n; i++) {
79 rsnew += r[i]*r[i];
80 }
81 printf("\n===rsnew is: %f\n", rsnew);
82
83#ifdef _CIVL
84 $assume(rsold !=0);
85#endif
86 rsfrac = rsnew/rsold; //Step 5
87 printf("\n===Scalar beta is: %f\n", rsfrac);
88 for(int i=0; i<n; i++) {
89 tempp[i] = r[i] +rsfrac*p[i]; //Step 6
90 printf("\n===Next search direction is: %f\n", tempp[i]);
91 }
92
93 for(int i=0; i<n; i++) {
94 p[i] = tempp[i];
95 }
96
97 rsold = rsnew;
98
99 //second loop, i == 1;
100 for(int i=0; i<n; i++) {
101 temp[i] = 0.0;
102 for(int j=0; j<n; j++) {
103 temp[i] += A[i][j]*p[j];
104 }
105 }
106 alpha = 0.0;
107 for(int i=0; i<n; i++) {
108 alpha += p[i]*temp[i];
109 }
110 printf("\n===alphaDenom2 is: %f\n", alpha);
111
112#ifdef _CIVL
113 $assume(alpha !=0);
114#endif
115 alpha = rsold/alpha; //Step 7
116 printf("\n===Scalar alpha is: %f\n", alpha);
117
118 for(int i=0; i<n; i++) {
119 tempp[i] = r[i] -alpha*temp[i]; //Step 8
120 printf("\n===tempp[%d] is: %f\n", i, tempp[i]);
121 }
122
123 for(int i=0; i<n; i++) {
124 r[i] = tempp[i];
125 }
126
127 for(int i=0; i<n; i++) {
128 tempp[i] = x[i] +alpha*p[i]; //Step 9
129 }
130
131 for(int i=0; i<n; i++) {
132 x[i] = tempp[i];
133 printf("\n===x[%d] is: %f\n", i, x[i]);
134 }
135}
136
137void main() {
138 double bncg[n];
139 double A[n][n];
140 A[0][0] = a1;
141 A[0][1] = a2;
142 A[1][0] = a2;
143 A[1][1] = a3;
144 $assume(b[0]!=0 || b[1]!=0);
145 cg(A,b,xcg,n);
146 printf("\n================Solution x:================\n");
147 for(int i=0; i<n; i++) {
148 printf("CG(%d): %f\n",i, xcg[i]);
149 }
150 for(int i=0; i<n; i++) {
151 bncg[i] = 0;
152 for(int j=0; j<n; j++) {
153 bncg[i] += A[i][j]*xcg[j];
154 }
155 printf("b final (%d)=%f\n", i, b[i]);
156 printf("b finalnCG(%d)=%f\n", i, bncg[i]);
157 $assert(bncg[i] == b[i]);
158 }
159}
160