<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   <meta name="GENERATOR" content="Mozilla/4.5 [en] (X11; I; SunOS 5.6 sun4u) [Netscape]">
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B" alink="#FF0000">
&nbsp;
<br><font color="#CC0000">/******** This is added to BandMatrix.java  : **************************************************/</font>
<br>&nbsp;
<br>&nbsp;<font color="#009900"></font>
<p><font color="#009900">/**Jacobi iterations for 3-banded matrix****************************************************************/</font>
<br>public double[] jacobi3(double[] rhs) {
<br>double[] sol = new double[lines];
<br>double[] previous = new double[lines];
<br>int i,ii;
<br>int iterations=0;
<br>boolean ready=false;
<p>while (!ready){
<br>for (ii=0;ii&lt;=n;ii++){previous[ii]=sol[ii];}
<br>sol[0]=(rhs[0]-m[l][0]*previous[n]-m[r][0]*previous[1])/m[c][0];
<br>for(i=1;i&lt;=n-1;i++){
<br>sol[i]=(rhs[i]-m[l][i]*previous[i-1]-m[r][i]*previous[i+1])/m[c][i];}
<br>sol[n]=(rhs[n]-m[l][n]*previous[n-1]-m[r][n]*previous[0])/m[c][n];
<p>ready=test(sol,previous); // Testing for convergence
<br>iterations++;}
<br>System.out.println("jacobi iterations= "+iterations);
<br>return sol;
<br>}// jacobi3
<p>/<font color="#009900">**Forward Gauss Seidel-Successive Over Relaxation
for 3-banded matrix****************************************************************/</font>
<br>public double[] fgs3(double[] rhs, double w ) {
<br>double[] hsol = new double[lines];
<br>double[] previous = new double[lines];
<br>int i,ii;
<br>int iterations=0;
<br>boolean ready=false;
<p>while (!ready){
<br>for (ii=0;ii&lt;=n;ii++){previous[ii]=hsol[ii];}
<p>//Forward Gauss Seidel, periodicity included
<br>hsol[0]=(w*(rhs[0]-m[r][0]*previous[1]-m[l][0]*hsol[n])+(1-w)*m[c][0]*previous[0])/m[c][0];
<br>for(i=1;i&lt;=n-1;i++){
<br>hsol[i]=(w*(rhs[i]-m[r][i]*previous[i+1]-m[l][i]*hsol[i-1])+(1-w)*m[c][i]*previous[i])/m[c][i];}
<br>hsol[n]=(w*(rhs[n]-m[r][n]*previous[0]-m[l][n]*hsol[n-1])+(1-w)*m[c][n]*previous[n])/m[c][n];
<p>ready=test(hsol,previous); // Testing for convergence
<br>iterations++;}
<p>System.out.println("fgs iterations= "+iterations);
<br>return hsol;
<br>}// fgs3
<p>/<font color="#009900">**Backward Gauss seidel, over relaxated, for
3-banded matrix****************************************************************/</font>
<br>public double[] bgs3(double[] rhs, double w ) {
<br>double[] sol = new double[lines];
<br>double[] hsol = new double[lines];
<br>int j,ii;
<br>int iterations=0;
<br>boolean ready=false;
<p>while (!ready){
<br>for (ii=0;ii&lt;=n;ii++){hsol[ii]=sol[ii];}
<p>// Backward Gauss Seidel, periodicity included
<br>sol[n]=(w*(rhs[n]-m[l][n]*hsol[n-1]-m[r][n]*sol[0])+(1-w)*m[c][n]*hsol[n])/m[c][n];;
<br>for(j=n-1;j>=1;j--){
<br>sol[j]=(w*(rhs[j]-m[l][j]*hsol[j-1]-m[r][j]*sol[j+1])+(1-w)*m[c][j]*hsol[j])/m[c][j];}
<br>sol[0]=(w*(rhs[0]-m[l][0]*hsol[n]-m[r][0]*sol[1])+(1-w)*m[c][0]*hsol[0])/m[c][0];
<p>ready=test(sol,hsol); // Testing for convergence
<br>iterations++;}
<p>System.out.println("bgs iterations= "+iterations);
<br>return sol;
<br>}// bgs3<font color="#009900"></font>
<p><font color="#009900">/**Symmetric Successive Over Relaxation for 3-banded
matrix****************************************************************/</font>
<br>public double[] ssor3(double[] rhs, double w ) {
<br>double[] sol = new double[lines];
<br>double[] hsol = new double[lines];
<br>double[] previous = new double[lines];
<br>int j,i,ii;
<br>int iterations=0;
<br>boolean ready=false;
<br>&nbsp;
<p>while (!ready){
<br>for (ii=0;ii&lt;=n;ii++){previous[ii]=sol[ii];}
<p>// Forward Gauss Seidel, one half-step
<br>hsol[0]=(w*(rhs[0]-m[r][0]*previous[1]-m[l][0]*hsol[n])+(1-w)*m[c][0]*previous[0])/m[c][0];
<br>for(i=1;i&lt;=n-1;i++){
<br>hsol[i]=(w*(rhs[i]-m[r][i]*previous[i+1]-m[l][i]*hsol[i-1])+(1-w)*m[c][i]*previous[i])/m[c][i];}
<br>hsol[n]=(w*(rhs[n]-m[r][n]*previous[0]-m[l][n]*hsol[n-1])+(1-w)*m[c][n]*previous[n])/m[c][n];
<p>// Backward Gauss Seidel, next half-step
<br>sol[n]=(w*(rhs[n]-m[l][n]*hsol[n-1]-m[r][n]*sol[0])+(1-w)*m[c][n]*hsol[n])/m[c][n];;
<br>for(j=n-1;j>=1;j--){
<br>sol[j]=(w*(rhs[j]-m[l][j]*hsol[j-1]-m[r][j]*sol[j+1])+(1-w)*m[c][j]*hsol[j])/m[c][j];}
<br>sol[0]=(w*(rhs[0]-m[l][0]*hsol[n]-m[r][0]*sol[1])+(1-w)*m[c][0]*hsol[0])/m[c][0];
<p>ready=test(sol,previous); // Testing for convergence
<br>iterations++;}
<p>System.out.println(" ssor iterations="+iterations);
<br>return sol;
<br>}// ssor3
<br>&nbsp;
<p><font color="#993399">public boolean test(double[] sol, double[] previous)
{</font>
<br><font color="#993399">int p=1;</font>
<br><font color="#993399">double diff;</font>
<br><font color="#993399">double lim=Math.pow(10.,-6);</font>
<br><font color="#993399">boolean rdy=false;</font><font color="#993399"></font>
<p><font color="#993399">testloop: for (int k=0 ; k&lt;=n ; k++){</font>
<br><font color="#993399">//System.out.println("k="+k);</font>
<br><font color="#993399">diff=Math.abs(sol[k]-previous[k]);</font>
<br><font color="#993399">//System.out.println("diff="+diff);</font>
<br><font color="#993399">if (diff >= lim ) {p=1;}</font>
<br><font color="#993399">else {p=0;}</font>
<br><font color="#993399">switch (p) {</font>
<br><font color="#993399">case 1: rdy=false;break testloop;</font>
<br><font color="#993399">case 0: rdy=true;continue;}</font>
<br><font color="#993399">}</font>
<br><font color="#993399">return rdy;</font>
<br><font color="#993399">}// test</font>
</body>
</html>
