// sparse.java Sparse storage of a matrix // specifically designed for solving PDE // simultaneous equations. // zero based subscripting // column [nrow] is right hand side import java.io.*; public class sparse { cell A[]; public sparse(int nrow) // constructor { A = new cell[nrow]; for(int i=0; itemp.j { temp = temp.next; } else { // System.out.println("getval("+aj+") no such j"); // not error return 0.0; } } } // end get val from cell j in this row, zero if not in list public void setval(int aj, double aval) // creates j if not in list { if(j<0 || j==aj) { j = aj; val = aval; return; } if(ajA.length || i<0) { System.out.println("sparse.get("+i+","+j+") bad index"); return 0.0; } return A[i].getval(j); } // end get public void put(int i, int j, double val) { if(i>A.length || i<0) { System.out.println("sparse.put("+i+","+j+") bad index"); return; } A[i].setval(j,val); } // end put public double[] getRHS() { cell B; int thisj; int n = A.length; double Y[] = new double[n]; Boolean more; for(int i=0; i k traverse list to end int thisk; double valk, valj; Akk = A[kr]; while(true) { thisk = Akk.getj(); if(thisk>k) { System.out.println("divide("+kr+","+k+") ERROR, no k in this row!"); return; } else if(thisk==k) { break; } else { if(Akk.getnext()!=null) { Akk = Akk.next; } else { System.out.println("divide("+kr+","+k+") ERROR, no k this big"); return; } } // end else } // end first while, positioned at col index k valk = Akk.getval(); Akj = Akk; while(Akj.getnext()!=null) { valj = Akj.next.getval(); Akj.next.setval(valj/valk); Akj = Akj.next; } // end second while } // end divide public void reduce(int ir, int k, int kr) // works on complete row j=k+1..n { // B[row[i]][j] = B[row[i]][j] - B[row[i]][k] * B[row[k]][j]; cell Aij, Aij_prev, Aik, Akj; int thisij, thisik, thiskj; // j > k traverse all j double valij, valik, valkj; // find Aik and valik constant for while loop on j Aik = A[ir]; thisik = Aik.getj(); valik = 0.0; valij = 0.0; valkj = 0.0; if(thisik==k) { valik = Aik.getval(); } else { while(thisik<=k) { if(thisik==k) { valik = Aik.getval(); break; } else { if(Aik.getnext()!=null) { Aik = Aik.next; thisik = Aik.getj(); } else { break; // valik is zero } // end if != } // end if ==k } // end while } // end ==k if(valik == 0.0) return; // no change possible Aij = Aik; // go from here.next Aij_prev = Aik; Akj = A[kr]; // find valij and valkj (both move in j, no change if either not exists) while(true) // walk j, must have a pair with neither zero { thisij = Aij.getj(); thiskj = Akj.getj(); valij = Aij.getval(); valkj = Akj.getval(); if(thiskj<=k) // kj must be bigger than k { if(Akj.getnext()!=null) { Akj = Akj.next; thiskj = Akj.getj(); valkj = Akj.getval(); continue; } else { return; } } if(thisijthiskj) // must insert a node { Aij_prev.next = new cell(thiskj,Aij_prev.next,0.0); Aij = Aij_prev.next; thisij = Aij.getj(); valij = Aij.getval(); } // must be equal Aij_prev.next.setval(valij-valik*valkj); if(Aij.getnext()!=null) { Aij_prev = Aij; Aij = Aij.next; } else { return; } if(Akj.getnext()!=null) { Akj = Akj.next; } else { return; } } // end while walking j } // end reduce public void clear() { for(int i=0; i=0) { val = B.getval(); if(j<=jprev) { System.out.println("i="+i+",j="+j+", val="+val+" ERROR in matrix"); } else { System.out.println("i="+i+",j="+j+", val="+val); } if(B.next != null) { B = B.next; jprev = j; j = B.getj(); } else j = -2; } // end while } // end i } // end write_all // simeq solve simultaneous equations AX=Y // solve real linear equations for X where Y = A * X // method: Gauss-Jordan elimination using maximum pivot // Translated to java by : Jon Squire , 26 March 2003 // First written by Jon Squire December 1959 for IBM 650, translated to // other languages e.g. Fortran converted to Ada converted to C // then converted to java, then to sparse public void simeq(double X[]) // X returned solution { int hold , I_pivot; // pivot indicies double pivot; // pivot element value double abs_pivot; int n = A.length; int row[] = new int[n]; // row interchange indicies // set up row interchange vectors for(int k=0; k abs_pivot) // B[row[i]][k]) { I_pivot = i; abs_pivot = Math.abs(pivot); } } // have pivot, interchange row indicies hold = row[k]; row[k] = row[I_pivot]; row[I_pivot] = hold; // check for near singular if(abs_pivot < 1.0E-10) { for(int j=k+1; j=0) { val = B.getval(); if(j<=jprev) { System.out.println("i="+i+",j="+j+", val="+val+ " ERROR in sparse matrix"); return M; } else { M[i][j] = val; } if(B.next != null) { B = B.next; jprev = j; j = B.getj(); } else j = -2; } // end while } // end i return M; } // end export } // end sparse.java