1919
2020package 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;
2728import it .geoframe .blogspot .numerical .matop .*;
2829
2930/**
4849
4950public 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 \t k: " + iter +"\t sqrt(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