source: CIVL/examples/cg/3x3case_CG.cvl@ 2847ad1

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since 2847ad1 was 2d6a470, checked in by Stephen Siegel <siegel@…>, 10 years ago

Helping Si clean these up

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@2976 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 2.2 KB
RevLine 
[2d6a470]1#include <civlc.cvh>
2#include <stdio.h>
3#define n 3
4
5$input double diag1,diag2,diag3,off1,off2,off3;
6$input double b[n];
7double x[n];
8double xcg[n];
9
10void cg(double A[n][n], double b[n], double x[n], int steps) {
11 double r[n];
12 double p[n];
13 double temp[n];
14 double tempp[n];
15 double rsold;
16 double rsnew;
17 double rsfrac;
18 double alpha;
19
20 // x = 0
21 for(int i=0; i<n; i++) x[i] = 0;
22
23 // temp = A*x
24 for(int i=0; i<n; i++) {
25 temp[i] = 0.0;
26 for(int j=0; j<n; j++) {
27 temp[i] += A[i][j]*x[j];
28 }
29 }
30
31 // r = b-temp
32 for(int i=0; i<n; i++) {
33 r[i] = b[i] -temp[i];
34 }
35
36 // rsold = <r,r>
37 rsold = 0.0;
38 for(int i=0; i<n; i++) {
39 rsold += r[i]*r[i];
40 }
41
42 // p=r
43 for(int i=0; i<n; i++) {
44 p[i] = r[i];
45 }
46
47 for(int i=0; i<steps; i++) {
48 // temp = A*p
49 for(int i=0; i<n; i++) {
50 temp[i] = 0.0;
51 for(int j=0; j<n; j++) {
52 temp[i] += A[i][j]*p[j];
53 }
54 }
55 alpha = 0.0;
56 for(int i=0; i<n; i++) {
57 alpha += p[i]*temp[i];
58 }
59
60 $assume(alpha !=0);
61
62 alpha = rsold/alpha;
63 // tempp = r-alpha*temp
64 for(int i=0; i<n; i++) {
65 tempp[i] = r[i] -alpha*temp[i];
66 }
67 for(int i=0; i<n; i++) {
68 r[i] = tempp[i];
69 }
70 for(int i=0; i<n; i++) {
71 tempp[i] = x[i] +alpha*p[i];
72 }
73 for(int i=0; i<n; i++) {
74 x[i] = tempp[i];
75 }
76 if(i<steps-1) {
77 // rsnew = <r,r>
78 rsnew = 0.0;
79 for(int i=0; i<n; i++) {
80 rsnew += r[i]*r[i];
81 }
82
83 $assume(rsold !=0);
84
85 rsfrac = rsnew/rsold;
86 for(int i=0; i<n; i++) {
87 tempp[i] = r[i] +rsfrac*p[i];
88 }
89 for(int i=0; i<n; i++) {
90 p[i] = tempp[i];
91 }
92 rsold = rsnew;
93 }
94 }
95}
96
97void main() {
98 double bncg[n];
99 double A[n][n];
100
101 A[0][0] = diag1;
102 A[1][1] = diag2;
103 A[2][2] = diag3;
104 A[0][1] = off1;
105 A[1][0] = off1;
106 A[0][2] = off2;
107 A[2][0] = off2;
108 A[1][2] = off3;
109 A[2][1] = off3;
110
111 cg(A,b,xcg,n);
112 printf("\n================Solution x:================\n");
113 for(int i=0; i<n; i++) {
114 printf("x[%d] = %f\n\n",i, xcg[i]);
115 }
116 for(int i=0; i<n; i++) {
117 bncg[i] = 0;
118 for(int j=0; j<n; j++) {
119 bncg[i] += A[i][j]*xcg[j];
120 }
121 $assert(bncg[i] == b[i]);
122 }
123}
Note: See TracBrowser for help on using the repository browser.