Skip to content

Commit 5aaedcd

Browse files
committed
Add the Conjugate Gradient method for solving linear systems
1 parent 6d39fa6 commit 5aaedcd

File tree

1 file changed

+55
-36
lines changed

1 file changed

+55
-36
lines changed

src/main/java/it/geoframe/blogspot/numerical/linearsystemsolver/ConjugateGradientMethod.java

Lines changed: 55 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@
1919

2020
package it.geoframe.blogspot.numerical.linearsystemsolver;
2121

22-
import java.util.HashMap;
23-
import java.util.Map;
22+
import java.util.ArrayList;
23+
import java.util.Arrays;
24+
import java.util.List;
2425

25-
import bidimensionalDomain.Geometry;
26-
import bidimensionalDomain.Topology;
26+
//import bidimensionalDomain.Geometry;
27+
//import bidimensionalDomain.Topology;
2728
import it.geoframe.blogspot.numerical.matop.*;
2829

2930
/**
@@ -48,41 +49,51 @@
4849

4950
public class ConjugateGradientMethod {
5051

51-
double alpha;
52-
double alphak;
53-
double lambda;
54-
double tmp;
55-
double cgTolerance;
56-
Map<Integer, Double> residual;
57-
Map<Integer, Double> x;
58-
Map<Integer, Double> p;
59-
Map<Integer, Double> Apsi;
60-
Topology topology;
61-
Geometry geometry;
62-
Matop matop;
52+
private double alpha;
53+
private double alphak;
54+
private double lambda;
55+
private double tmp;
56+
private double cgTolerance;
6357

64-
public ConjugateGradientMethod(Matop matop, double cgTolerance) {
58+
private List<Double> residual;
59+
private List<Double> x;
60+
private List<Double> p;
61+
private List<Double> Apsi;
62+
63+
private List<Integer> elements;
64+
65+
private Matop matop;
66+
67+
public ConjugateGradientMethod(Matop matop, double cgTolerance, List<Integer> elements) {
6568

66-
residual = new HashMap<Integer, Double>();
67-
x = new HashMap<Integer, Double>();
68-
p = new HashMap<Integer, Double>();
69-
Apsi = new HashMap<Integer, Double>();
69+
residual = new ArrayList<Double>(Arrays.asList(new Double[elements.size()]));
70+
x = new ArrayList<Double>(Arrays.asList(new Double[elements.size()]));
71+
p = new ArrayList<Double>(Arrays.asList(new Double[elements.size()]));
72+
Apsi = new ArrayList<Double>(Arrays.asList(new Double[elements.size()]));
73+
this.elements = new ArrayList<Integer>(elements);
7074
this.matop = matop;
7175
this.cgTolerance = cgTolerance;
7276
}
7377

74-
public Map<Integer, Double> solve(Map<Integer, Double> dis, Map<Integer, Double> b, Map<Integer, Double> mainDiagonal){
75-
76-
x = b;
78+
public List<Double> solve(List<Double> dis, List<Double> rhs, List<Double> mainDiagonal){
7779

80+
x = new ArrayList<Double>(rhs);
81+
// System.out.println("x:");
82+
// for(int element=1; element<elements.size(); element++) {
83+
// System.out.println("\t"+ element + "\t" + x.get(element));
84+
// }
7885
Apsi = matop.solve(dis, x);
86+
// System.out.println("Apsi primo:");
87+
// for(int element=1; element<elements.size(); element++) {
88+
// System.out.println("\t"+ element + "\t" + Apsi.get(element)+ "\t" + dis.get(element)+ "\t" + x.get(element) );
89+
// }
7990
alpha = 0.0;
80-
for(Integer element : topology.s_i.keySet()) {
81-
residual.put(element, b.get(element)-Apsi.get(element));
91+
for(int element=1; element<elements.size(); element++) {
92+
residual.set(element, rhs.get(element)-Apsi.get(element));
8293
// no preconditioner
8394
// p.put(element, residual.get(element));
8495
// With preconditioner
85-
p.put(element, residual.get(element)/(mainDiagonal.get(element)+dis.get(element)));
96+
p.set(element, residual.get(element)/(mainDiagonal.get(element)+dis.get(element)));
8697
alpha += p.get(element)*residual.get(element);
8798
}
8899
int iter =1;
@@ -94,39 +105,47 @@ public Map<Integer, Double> solve(Map<Integer, Double> dis, Map<Integer, Double>
94105
}
95106

96107
tmp = 0.0;
97-
108+
// System.out.println("p:");
109+
// for(int element=1; element<elements.size(); element++) {
110+
// System.out.println("\t"+ element + "\t" + p.get(element));
111+
// }
98112
Apsi = matop.solve(dis, p);
99-
113+
// System.out.println("Apsi :");
114+
// for(int element=1; element<elements.size(); element++) {
115+
// System.out.println("\t"+ element + "\t" + Apsi.get(element));
116+
// }
100117
tmp = 0.0;
101-
for(Integer element : topology.s_i.keySet()) {
118+
for(int element=1; element<elements.size(); element++) {
102119
tmp += p.get(element)*Apsi.get(element);
103120
}
104121
lambda = alpha/tmp;
122+
// System.out.println("\t\t\t\ttmp: " + tmp + "\tlambda: " + lambda);
105123

106124
alphak = alpha;
107125
alpha = 0.0;
108-
for(Integer element : topology.s_i.keySet()) {
126+
for(int element=1; element<elements.size(); element++) {
109127
tmp = x.get(element) + lambda*p.get(element);
110-
x.put(element, tmp);
128+
x.set(element, tmp);
111129
tmp = residual.get(element) - lambda*Apsi.get(element);
112-
residual.put(element, tmp);
130+
residual.set(element, tmp);
113131
// no preconditioner
114132
// alpha += tmp*tmp;
115133
// with preconditioner
116134
alpha += tmp/(mainDiagonal.get(element)+dis.get(element))*tmp;
117135
}
118136

119-
for(Integer element : topology.s_i.keySet()) {
137+
// System.out.println("\t\t\t\t\talpha: " + alpha + "\talphak: " + alphak);
138+
for(int element=1; element<elements.size(); element++) {
120139
// no preconditioner
121140
// tmp = residual.get(element)+alpha/alphak*p.get(element);
122141
// with preconditioner
123142
tmp = residual.get(element)/(mainDiagonal.get(element)+dis.get(element))+alpha/alphak*p.get(element);
124-
p.put(element, tmp );
143+
p.set(element, tmp );
125144
}
126145

127146
iter++;
128147
}
129-
System.out.println("\t\t\t\t\tk: " + iter +"\tsqrt(alpha): " +Math.sqrt(alpha));
148+
// System.out.println("\t\t\t\t\tk: " + iter +"\tsqrt(alpha): " +Math.sqrt(alpha));
130149

131150
return x;
132151
}

0 commit comments

Comments
 (0)