// pde45h_eq.java homogenous Biharmonic 4th order, 4 dimensions // solve Uwwww(w,x,y,z,t) + Uxxxx(w,x,y,z,t) + Uyyyy(w,x,y,z,t) + // Uzzzz(w,x,y,z,t) + Utttt(w,x,y,z,t) + 2 Uww(w,x,y,z,t) + // 2 Uxx(w,x,y,z,t) + 2 Uyy(w,x,y,z,t) + 2 Uzz(w,x,y,z,t) + // 2 Utt(w,x,y,z,t) + 5 U(w,x,y,z,t) = 0 // // boundary conditions computed using U(w,x,y,z,t) // analytic solution is U(w,x,y,z,t) = sin(w+x+y+z+t) // // replace continuous derivatives with discrete derivatives // solve for U(w,x,y,z,t) numerical approximation U // A * U = F, solve simultaneous equations for U // // uses simeq.java // uses rderiv.java import java.text.*; import java.io.*; class pde45h_eq { final int nw = 6; // problem parameters final int nx = 6; final int ny = 6; final int nz = 6; final int nt = 6; final int nwxyzt = (nw-2)*(nx-2)*(ny-2)*(nz-2)*(nt-2); double A[][] = new double[nwxyzt][nwxyzt+1]; // last column is RHS double U[] = new double[nwxyzt]; // computed solution double wg[] = new double[nw]; double xg[] = new double[nx]; double yg[] = new double[ny]; double zg[] = new double[nz]; double tg[] = new double[nt]; double Ua[] = new double[nwxyzt]; // check solution double wmin = 0.0; // problem parameters double wmax = 1.5708; double xmin = 0.0; double xmax = 1.5708; double ymin = 0.0; double ymax = 1.5708; double zmin = 0.0; double zmax = 1.5708; double tmin = 0.0; double tmax = 1.5708; double hw, hx, hy, hz, ht; DecimalFormat f6 = new DecimalFormat("0.000"); DecimalFormat fe = new DecimalFormat("0.000E00"); pde45h_eq() { double w, x, y, z, t; int k, cs; // derivative point arrays, dynamic in this version double cww[] = new double[nw]; double cxx[] = new double[nx]; double cyy[] = new double[ny]; double czz[] = new double[nz]; double ctt[] = new double[nt]; double cwwww[] = new double[nw]; double cxxxx[] = new double[nx]; double cyyyy[] = new double[ny]; double czzzz[] = new double[nz]; double ctttt[] = new double[nt]; double val, err, avgerr, maxerr; double time_start; double time_now; double time_last; System.out.println("pde45h_eq.java running "); System.out.println("Given Uwwww(w,x,y,z,t) + Uxxxx(w,x,y,z,t) + Uyyyy(w,x,y,z,t) + "); System.out.println(" Uzzzz(w,x,y,z,t) + Utttt(w,x,y,z,t) + 2 Uww(w,x,y,z,t) + "); System.out.println(" 2 Uxx(w,x,y,z,t) + 2 Uyy(w,x,y,z,t) + 2 Uzz(w,x,y,z,t) + "); System.out.println(" 2 Utt(w,x,y,z,t) + 5 U(w,x,y,z,t) = 0"); System.out.println("wmin<=w<=wmax xmin<=x<=xmax ymin<=y<=ymax Boundaries"); System.out.println("zmin<=z<=zmax tmin<=t<=tmax Boundaries"); System.out.println("Analytic solution U(w,x,y,z,t) = sin(w+x+y+z+t"); System.out.println(" "); System.out.println("wmin="+wmin+", wmax="+wmax+", xmin="+xmin+", xmax="+xmax); System.out.println("ymin="+ymin+", ymax="+ymax+", zmin="+zmin+", zmax="+zmax); System.out.println("tmin="+tmin+", tmax="+tmax); System.out.println("nw="+nw+", nx="+nx+", ny="+ny+", nz="+nz+", nt="+nt); time_start = (double)System.currentTimeMillis()/1000.0; time_last = time_start; System.out.println("w grid and analytic solution at xmin,ymin,zmin,tmin "); hw = (wmax-wmin)/(double)(nw-1); for(int i=0; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+","+ii+","+iii+","+iiii+","+iiiii+ "]="+ f6.format(U[s(i,ii,iii,iiii,iiiii)])+ ", Ua="+ f6.format(Ua[s(i,ii,iii,iiii,iiiii)])+ ", err="+ fe.format(err)); } // iiiii } // iiii } // iii } // ii } // i time_now = (double)System.currentTimeMillis()/1000.0; System.out.println("total CPU time = "+(time_now-time_start)+" seconds"); System.out.println(" "); System.out.println(" maxerr="+fe.format(maxerr)+ ", avgerr="+fe.format((avgerr/(double)(nx*ny*nz*nt)))); System.out.println(" "); System.out.println("end pde45h_eq.java"); } // end pde45h_eq int s(int i, int ii, int iii, int iiii, int iiiii) // for w,x,y,z,t { return (i-1)*(nx-2)*(ny-2)*(nz-2)*(nt-2) + (ii-1)*(ny-2)*(nz-2)*(nt-2) + (iii-1)*(nz-2)*(nt-2) + (iiii-1)*(nt-2) + (iiiii-1); } // end s // problem RHS, 0 // problem boundaries (and analytic solution for checking) double uana(double w, double x, double y, double z, double t) { return Math.sin(w+x+y+z+t); } void check_soln(double u[]) { // solve Uwwww(w,x,y,z,t) + Uxxxx(w,x,y,z,t) + Uyyyy(w,x,y,z,t) + // Uzzzz(w,x,y,z,t) + Utttt(w,x,y,z,t) + 2 Uww(w,x,y,z,t) + // 2 Uxx(w,x,y,z,t) + 2 Uyy(w,x,y,z,t) + 2 Uzz(w,x,y,z,t) + // 2 Utt(w,x,y,z,t) + 5 U(w,x,y,z,t) = 0 double val, err, smaxerr; int ib = 0; int iib = 0; int iiib = 0; int iiiib = 0; int iiiiib = 0; smaxerr = 0.0; for(int i=1; ismaxerr) { smaxerr = err; ib = i; iib = ii; iiib = iii; iiiib = iiii; iiiiib = iiiii; } } // end iiiii } // end iiii } // end iii } // end ii } // end i System.out.println("check_soln maxerr="+smaxerr); System.out.println("at "+ib+","+iib+","+iiib+","+iiiib+","+iiiiib); } // end check_soln void write_soln() { double w, x, y, z, t; try { FileWriter fout = new FileWriter("pde45h_eq_java.dat"); BufferedWriter fileout = new BufferedWriter(fout); System.out.println("writing pde45h_eq.dat"); fileout.write("5 "+nw+" "+nx+" "+ny+" "+nz+" "+nt+"\n"); for(int i=0; i2) System.out.println("about to read triangles from "+fname); // ntri=0; // minvert=999999; // nvert=0; // // try // { // BufferedReader in = new BufferedReader(new FileReader(fname)); // String input_line; // input_line = in.readLine(); // while(input_line != null) // { // if(debug>1) System.out.println(input_line); // // have a line, extract 3 integers // len = input_line.length(); // if(len<5) // not enough data, ignore blank lines // { // input_line = in.readLine(); // continue; // } // index = 0; // while(input_line.substring(index,index+1).equals(" ")){index++;} // last = input_line.indexOf(' ',index+1); // t1[ntri] = Integer.parseInt(input_line.substring(index,last)); // index = last+1; // while(input_line.substring(index,index+1).equals(" ")){index++;} // last = input_line.indexOf(' ',index+1); // t2[ntri] = Integer.parseInt(input_line.substring(index,last)); // index = last+1; // while(input_line.substring(index,index+1).equals(" ")){index++;} // last = input_line.indexOf(' ',index+1); // if(last<1) last = len; // t3[ntri] = Integer.parseInt(input_line.substring(index,last)); // // if(debug>1) System.out.println("tri "+ntri+" has vertices "+t1[ntri]+ // " "+t2[ntri]+" "+t3[ntri]); // if(t1[ntri]>nvert) nvert=t1[ntri]; // if(t2[ntri]>nvert) nvert=t2[ntri]; // if(t3[ntri]>nvert) nvert=t3[ntri]; // if(t1[ntri]