// pde47h_nu.java Biharmonic PDE in seven dimensions // solve Uxxxx(x,y,z,t,u,v,w) + Uyyyy(x,y,z,t,u,v,w) + Uzzzz(x,y,z,t,u,v,w) + // Utttt(x,y,z,t,u,v,w) + Uuuuu(x,y,z,t,u,v,w) + Uvvvv(x,y,z,t,u,v,w) + // Uwwww(x,y,z,t,u,v,w) + // 2 Uxx(x,y,z,t,u,v,w) + 2 Uyy(x,y,z,t,u,v,w) + 2 Uzz(x,y,z,t,u,v,w) + // 2 Utt(x,y,z,t,u,v,w) + 2 Uuu(x,y,z,t,u,v,w) + 2 Uvv(x,y,z,t,u,v,w) + // 2 Uww(x,y,z,t,u,v,w) + // 8 U(x,y,z,t,u,v,w) = f(x,y,z,t,u,v,w) // // boundary conditions computed using Ub(x,y,z,t,u,v,w) // analytic solution is U(x,y,z,t,u,v,w) = sin(x+y+z+t+u+v+w) // // subscripts in code use x[i], y[ii], z[iii], t[iiii], u[iiiii], // v[iiiiii], w[iiiiiii] // // replace continuous derivatives with discrete derivatives // solve for U(x,y,z,t,u,v,w) numerical approximation U // A * U = F, solve simultaneous equations for U // import java.text.*; import java.io.*; // uses nuderiv.java // uses simeq.java class pde47h_nu { int nx = 5; int ny = 5; int nz = 5; int nt = 5; int nu = 5; int nv = 5; int nw = 5; int nxyztuvw = (nx-2)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2); // DOF double A[] = new double[nxyztuvw*(nxyztuvw+1)]; // last column is RHS double U[] = new double[nxyztuvw]; // computed solution, no boundary double xg[] = new double[nx]; // coordinates double yg[] = new double[ny]; double zg[] = new double[nz]; double tg[] = new double[nt]; double ug[] = new double[nu]; double vg[] = new double[nv]; double wg[] = new double[nw]; double Ua[] = new double[nxyztuvw]; // analytic solution for checking, no bou double xmin = 0.0; // problem parameters double xmax = 0.5; double ymin = 0.0; double ymax = 0.5; double zmin = 0.0; double zmax = 0.5; double tmin = 0.0; double tmax = 0.5; double umin = 0.0; double umax = 0.5; double vmin = 0.0; double vmax = 0.5; double wmin = 0.0; double wmax = 0.5; double hx, hy, hz, ht, hu, hv, hw; pde47h_nu() { double x, y, z, t, u, v, w; int i,ii,iii,iiii,iiiii,iiiiii,iiiiiii, j,jj,jjj,jjjj,jjjjj,jjjjjj,jjjjjjj; int k, cs; // coefficients of terms in first equation // 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 cuu[] = new double[nu]; double cvv[] = new double[nv]; double cww[] = new double[nw]; double cxxxx[] = new double[nx]; double cyyyy[] = new double[ny]; double czzzz[] = new double[nz]; double ctttt[] = new double[nt]; double cuuuu[] = new double[nu]; double cvvvv[] = new double[nv]; double cwwww[] = new double[nw]; double val, err, avgerr, maxerr; double time_start; double time_now; double time_last; System.out.println("pde47h_nu.java running "); System.out.println("Given Uxxxx(x,y,z,t,u,v,w) + Uyyyy(x,y,z,t,u,v,w) + Uzzzz(x,y,z,t,u,v,w) +"); System.out.println(" Utttt(x,y,z,t,u,v,w) + Uuuuu(x,y,z,t,u,v,w) + Uvvvv(x,y,z,t,u,v,w) +"); System.out.println(" Uwwww(x,y,z,t,u,v,w) +"); System.out.println(" 2 Uxx(x,y,z,t,u,v,w) + 2 Uyy(x,y,z,t,u,v,w) + 2 Uzz(x,y,z,t,u,v,w) +"); System.out.println(" 2 Utt(x,y,z,t,u,v,w) + 2 Uuu(x,y,z,t,u,v,w) + 2 Uvv(x,y,z,t,u,v,w) +"); System.out.println(" 2 Uww(x,y,z,t,u,v,w) +"); System.out.println(" 8 U(x,y,z,t,u,v,w) = f(x,y,z,t,u,v,w) "); System.out.println(" "); System.out.println("xmin<=x<=xmax ymin<=y<=ymax zmin<=z<=zmax "); System.out.println("tmin<=t<=tmax umin<=u<=umax vmin<=v<=vmax "); System.out.println("wmin<=w<=wmax Boundaries "); System.out.println("Analytic solution U(x,y,z,t,u,v,w) = sin(x+y+z+t+u+v+w) "); 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("umin="+umin+", umax="+umax+ ", vmin="+vmin+", vmax="+vmax); System.out.println("wmin="+wmin+", wmax="+wmax); System.out.println("nx="+nx+", ny="+ny+", nz="+nz+", nt="+nt+ ", nu="+nu+", nv="+nv+", nw="+nw); time_start = (double)System.currentTimeMillis()/1000.0; System.out.println("time start="+time_start+" seconds"); System.out.println("DOF, degrees of freedom, nxyztuvw="+nxyztuvw); time_last = time_start; System.out.println(" "); System.out.println("x grid and analytic solution at minimums "); hx = (double)(nx*(nx-1))/2.0; i = 0; xg[i] = xmin; System.out.println("i="+i+", Ua("+xg[i]+","+ymin+","+zmin+ ","+tmin+","+umin+","+vmin+","+wmin+")="+ Ub(xg[i],ymin,zmin,tmin,umin,vmin,wmin)); for(i=1; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+","+ii+","+iii+","+iiii+","+ iiiii+","+iiiiii+","+iiiiiii+"]="+ U[s(i,ii,iii,iiii,iiiii,iiiiii,iiiiiii)]+ ", Ua="+Ua[s(i,ii,iii,iiii,iiiii,iiiiii,iiiiiii)]+ ", err="+err); } // iiiiiii } // iiiiii } // 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="+maxerr+ ", avgerr="+(avgerr/(double)nxyztuvw)); System.out.println(" "); System.out.println("end pde47h_nu.java "); } // end pde47h_nu // utility functions int s(int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int iiiiiii) // for x,y,z,t,u,v,w in loops for(int i=0; i=nxyztuvw) System.out.println("bad s("+i+","+ii+","+iii+ ","+iiii+","+iiiii+","+iiiiii+","+iiiiiii+") ="+k); return k; } // end s int sk(int k, int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int iiiiiii) // for x,y,z,t,u,v,w { return k*(nxyztuvw+1) + (i-1)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2) + (ii-1)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2) + (iii-1)*(nt-2)*(nu-2)*(nv-2)*(nw-2) + (iiii-1)*(nu-2)*(nv-2)*(nw-2) + (iiiii-1)*(nv-2)*(nw-2) + (iiiiii-1)*(nw-2) + (iiiiiii-1); } // end sk int ss(int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int iiiiiii, int j, int jj, int jjj, int jjjj, int jjjjj, int jjjjjj, int jjjjjjj) { return s(i,ii,iii,iiii,iiiii,iiiiii,iiiiiii)*(nxyztuvw+1) + s(j,jj,jjj,jjjj,jjjjj,jjjjjj,jjjjjjj); } // end ss double Ub(double x, double y, double z, double t, double u, double v, double w) //analytic solution and boundaries { return Math.sin(x+y+z+t+u+v+w); } // end Ub double f(double x, double y, double z, double t, double u, double v, double w) //analytic solution and boundaries { return Math.sin(x+y+z+t+u+v+w); } // end f double eval_derivative(int xord, int yord, int zord, int tord, int uord, int vord, int word, int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int iiiiiii, double U[]) { int j, jj, jjj, jjjj, jjjjj, jjjjjj, jjjjjjj; double cx[] = new double[nx]; double cy[] = new double[ny]; double cz[] = new double[nz]; double ct[] = new double[nt]; double cu[] = new double[nu]; double cv[] = new double[nv]; double cw[] = new double[nw]; double discrete; double x, y, z, t, u, v, w; new nuderiv(vord, nx, i, xg, cx); x = xg[i]; new nuderiv(word, ny, ii, yg, cy); y = yg[ii]; new nuderiv(xord, nz, iii, zg, cz); z = zg[iii]; new nuderiv(yord, nt, iiii, tg, ct); t = tg[iiii]; new nuderiv(zord, nu, iiiii, ug, cu); u = ug[iiiii]; new nuderiv(tord, nv, iiiiii, vg, cv); v = vg[iiiiii]; new nuderiv(tord, nw, iiiiiii, wg, cw); w = wg[iiiiii]; discrete = 0.0; // seven cases of one partial x, y, z, t, u, v, w to any order if(xord!=0 && yord==0 && zord==0 && tord==0 && uord==0 && vord==0 && word==0) for(j=0; jsmaxerr) { smaxerr = err; ib = i; iib = ii; iiib = iii; iiiib = iiii; iiiiib = iiiii; iiiiiib = iiiiii; iiiiiiib = iiiiiii; } } // end iiiiiii } // end iiiiii } // 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+","+iiiiiib+","+iiiiiiib+")"); } // end check_soln void write_soln(double U[]) // for plot7d_gl { double x, y, z, t, u, v, w; try { FileWriter fout = new FileWriter("pde47h_nu_java.dat"); BufferedWriter fileout = new BufferedWriter(fout); System.out.println("writing pde47h_nu_java.dat"); fileout.write("7 "+nx+" "+ny+" "+nz+" "+nt+" "+nu+" "+nv+" "+nw+"\n"); for(int i=0; i