source: CIVL/examples/cg/cg3.cvl

main
Last change on this file was ea777aa, checked in by Alex Wilton <awilton@…>, 3 years ago

Moved examples, include, build_default.properties, common.xml, and README out from dev.civl.com into the root of the repo.

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

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