// pde44h_eq.java homogenous Biharmonic 4th order, 4 dimensions // solve uxxxx(x,y,z,t) + uyyyy(x,y,z,t) + uzzzz(x,y,z,t) + // utttt(x,y,z,t) + 2 uxx(x,y,z,t) + 2 uyy(x,y,z,t) + // 2 uzz(x,y,z,t) + 2 u(x,y,z,t) = 0 // // boundary conditions computed using u(x,y,z,t) // analytic solution is u(x,y,z,t) = sim(x,y,z,t) // // replace continuous derivatives with discrete derivatives // solve for Uijkl numerical approximation U(x_i,y_j,z_k,t_l) // A * U = F, solve simultaneous equations for U // // fourth order numerical difference order=4, npoints=5, term=0 // d^4u/dx^4 = (1/(b4[0]*hx^4))*(a4[0][0]*u(x,y,z,t) + a4[0][1]*u(x+hx,y,z,t) + // a4[0][2]*u(x+2hx,y,z,t) + a4[0][3]*u(x+3hx,y,z,t) +a4[0][4]*u(x+4hx,y,z,t)) // // d^4u/dx^4 using subscripts i,j,k,l for i a minimum subscript of x // d^4u/dx^4 =(1/(b4[0]*hx^4))*(a4[0][0]*u(i,j,k,l) + a4[0][1]*u(i+1,j,k,l) + // a4[0][2]*u(i+2,j,k,l) + a4[0][3]*u(i+3,j,k,l) +a4[0][4]*u(i+4,j,k,l)) // // d^4u/dy^4 using subscripts i,j,k,l for j a minimum subscript of y, etc // d^4u/dy^4 =(1/(b4[0]*hy^4))*(a4[0][0]*u(i,j,k,l) + a4[0][1]*u(i,j+1,k,l) + // a4[0][2]*u(i,j+2,k,l) + a4[0][3]*u(i,j+3,k,l) +a4[0][4]*u(i,j+4,k,l)) // // d^4u/dx^4 using subscripts i,j,k,l for i-2 and i+2 allowed subscripts of x // d^4u/dx^4 =(1/(b4[2]*hx^4))*(a4[2][0]*u(i-2,j,k,l) + a4[2][1]*u(i-1,j,k,l) + // a4[2][2]*u(i,j,k,l) + a4[2][3]*u(i+1,j,k,l) +a4[2][4]*u(i+2,j,k,l)) // // d^4u/dx^4 using subscripts i,j,k,l for i a maximum subscript of x // d^4u/dx^4 =(1/(b4[4]*hx^4))*(a4[4][0]*u(i-4,j,k,l) + a4[4][1]*u(i-3,j,k,l) + // a4[4][2]*u(i-2,j,k,l) + a4[4][3]*u(i-1,j,k,l) +a4[4][4]*u(i,j,k,l)) // // subscripts in code use x[i], y[ii], z[iii], t[iiii] // derivatives are computed with b,hx,a included as in // cx[j] for first derivative of x at point j // cxxxx[j] for fourth derivative of x at point j // cyy[jj]*czz[jjj] for d^4u/dy^2dz^2 at jj, jjj // The subscript versions of the derivatives are substituted into the // equation to be solved. The resulting equation is analytically solved // for u(i,j,k,l) = other u terms with coefficients and + f(xi,yj,zk,tl) // The boundaries xmin..xmax, ymin..ymax, zmin..zmax, tmin..tmax are known // The number of grid points in each dimension is known nx, ny, nz, nt // hx=(xmax-xmin)/(nx-1), hy=(ymax-ymin)/(ny-1), // hz=(zmax-zmin)/(nz-1), ht=(tmax-tmin)/(tx-1), // thus xi=xmin+i*hx, yj=ymin+j*hy, zk=zmin+k*hz, tl=tmin+l*ht // then the linear system of equations is built, // nxyzt=(nx-2)*(ny-2)*(nz-2)*(nt-2) equations because the boundary value // is known on each end. // The matrix A is nxyzt rows by nxyzt columns (nxyzt+1) columns including F // The forcing function vector F is nxyzt elements adjunct to A // The solution vector U is nxyzt elements. // The building of the A matix requires 4 nested loops for rows // i in 1..nx-1, j in 1..ny-1, k in 1..nz-1, l in 1..nt-1 for rows of A // then each term in the differential equation fills in that row // and cs = (nx-2)*(ny-2)*(nz-2)*(nt-2) the RHS, fills the last column of A // subscripting functions are used to compute linear subscripts of A, U // row=(i-1)*(ny-2)*(nz-2)*(nt-2)+(ii-1)*(nz-2)*(nt-2)+(iii-1)*(nt-2)+(iiii-1) // row*(nxyzt+1)+col for A // // care must be taken to move the negative of boundary elements to // the right hand size of the equation to be solved. These are subtracted // from the computed value of the forcing function, cs, for that row. // tests are j==0 || j==nx-1 ... jjjj==0 || jjjj==nt-1 for boundaries // uses simeq.java // uses deriv.java import java.text.*; import java.io.*; class pde44h_eq { final int nx = 6; // problem parameters final int ny = 6; final int nz = 6; final int nt = 6; final int nxyzt = (nx-2)*(ny-2)*(nz-2)*(nt-2); double A[][] = new double[nxyzt][nxyzt+1]; // last column is RHS double U[] = new double[nxyzt]; // computed solution double xg[] = new double[nx]; double yg[] = new double[ny]; double zg[] = new double[nz]; double tg[] = new double[nt]; double Ua[] = new double[nxyzt]; // check solution double xmin = 0.0; // problem parameters double xmax = 1.0; double ymin = 0.0; double ymax = 1.0; double zmin = 0.0; double zmax = 1.0; double tmin = 0.0; double tmax = 1.0; double hx, hy, hz, ht; DecimalFormat f6 = new DecimalFormat("0.000"); DecimalFormat fe = new DecimalFormat("0.000E00"); pde44h_eq() { double x, y, z, t; int k, cs; // derivative point arrays, dynamic in this version double cxx[] = new double[nx]; double cyy[] = new double[ny]; double czz[] = new double[nz]; double ctt[] = new double[nt]; 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("pde44h_eq.java running "); System.out.println("Given uxxxx(x,y,z,t) + uyyyy(x,y,z,t) + uzzzz(x,y,z,t) + "); System.out.println(" utttt(x,y,z,t) + 2 uxx(x,y,z,t) + 2 uyy(x,y,z,t) + "); System.out.println(" 2 uzz(x,y,z,t) + 2 u(x,y,z,t) = 0"); System.out.println("xmin<=x<=xmax ymin<=y<=ymax zmin<=z<=zmax Boundaries "); System.out.println("Analytic solution u(x,y,z,t) = sin(x+y+z+t"); System.out.println(" "); System.out.println("xmin="+xmin+", xmax="+xmax+", ymin="+ymin+", ymax="+ymax); System.out.println("zmin="+zmin+", zmax="+zmax+", tmin="+tmin+", tmax="+tmax); System.out.println("nx="+nx+", ny="+ny+", nz="+nz+", nt="+nt); time_start = (double)System.currentTimeMillis()/1000.0; time_last = time_start; System.out.println("x grid and analytic solution at ymin,zmin,tmin "); hx = (xmax-xmin)/(double)(nx-1); for(int i=0; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+","+ii+","+iii+","+iiii+"]="+ f6.format(U[s(i,ii,iii,iiii)])+", Ua="+ f6.format(Ua[s(i,ii,iii,iiii)])+", err="+ fe.format(err)); } // 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 pde44h_eq.java"); } // end pde44h_eq int s(int i, int ii, int iii, int iiii) // for x,y,z,t { return (i-1)*(ny-2)*(nz-2)*(nt-2) + (ii-1)*(nz-2)*(nt-2) + (iii-1)*(nt-2) + (iiii-1); } // end s int sk(int k, int i, int ii, int iii, int iiii) // for x,y,z,t { return k*(nxyzt+1) + (i-1)*(ny-2)*(nz-2)*(nt-2) + (ii-1)*(nz-2)*(nt-2) + (iii-1)*(nt-2) + (iiii-1); } // end sk int ss(int i, int ii, int iii, int iiii, int j, int jj, int jjj, int jjjj) { return s(i,ii,iii,iiii)*(nxyzt+1) + s(j,jj,jjj,jjjj); } // end ss // problem RHS, 0 // problem boundaries (and analytic solution for checking) double uana(double x, double y, double z, double t) { return Math.sin(x+y+z+t); } void printA() { int cs, k; cs = (nx-2)*(ny-2)*(nz-2)*(nt-2); // constant RHS column for(int i=1; ismaxerr) smaxerr = err; } // end iiii } // end iii } // end ii } // end i System.out.println("check_soln maxerr="+smaxerr); } // end check_soln void write_soln() { try { FileWriter fout = new FileWriter("pde44h_eq_java.dat"); BufferedWriter fileout = new BufferedWriter(fout); System.out.println("writing pde44h_eq.dat"); // not including boundary fileout.write("4 "+(nx-2)+" "+(ny-2)+" "+(nz-2)+" "+(nt-2)+"\n"); for(int i=1; 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]