// pde47hn_eq.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[i3], t[i4], u[i5], // v[i6], w[i7] // // 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 rderiv.java // uses simeq.java class pde47hn_eq { 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; pde47hn_eq() { double x, y, z, t, u, v, w; int i,ii,i3,i4,i5,i6,i7, j,jj,j3,j4,j5,j6,j7; 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("pde47hn_eq.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 = (xmax-xmin)/(double)(nx-1); 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+","+i3+","+i4+","+ i5+","+i6+","+i7+"]="+ U[s(i,ii,i3,i4,i5,i6,i7)]+ ", Ua="+Ua[s(i,ii,i3,i4,i5,i6,i7)]+ ", err="+err); } // i7 } // i6 } // i5 } // i4 } // i3 } // 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 pde47hn_eq.java "); } // end pde47hn_eq // utility functions int s(int i, int ii, int i3, int i4, int i5, int i6, int i7) // for x,y,z,t,u,v,w in loops for(int i=0; i=nxyztuvw) System.out.println("bad s("+i+","+ii+","+i3+ ","+i4+","+i5+","+i6+","+i7+") ="+k); return k; } // end s int sk(int k, int i, int ii, int i3, int i4, int i5, int i6, int i7) // 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) + (i3-1)*(nt-2)*(nu-2)*(nv-2)*(nw-2) + (i4-1)*(nu-2)*(nv-2)*(nw-2) + (i5-1)*(nv-2)*(nw-2) + (i6-1)*(nw-2) + (i7-1); } // end sk int ss(int i, int ii, int i3, int i4, int i5, int i6, int i7, int j, int jj, int j3, int j4, int j5, int j6, int j7) { return s(i,ii,i3,i4,i5,i6,i7)*(nxyztuvw+1) + s(j,jj,j3,j4,j5,j6,j7); } // 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 i3, int i4, int i5, int i6, int i7, double U[]) { int j, jj, j3, j4, j5, j6, j7; 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 rderiv(xord, nx, i, hx, cx); x = xg[i]; new rderiv(yord, ny, ii, hy, cy); y = yg[ii]; new rderiv(zord, nz, i3, hz, cz); z = zg[i3]; new rderiv(tord, nt, i4, ht, ct); t = tg[i4]; new rderiv(uord, nu, i5, hu, cu); u = ug[i5]; new rderiv(vord, nv, i6, hv, cv); v = vg[i6]; new rderiv(word, nw, i7, hw, cw); w = wg[i6]; 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; i3b = i3; i4b = i4; i5b = i5; i6b = i6; i7b = i7; } } // end i7 } // end i6 } // end i5 } // end i4 } // end i3 } // end ii } // end i System.out.println("check_soln maxerr="+smaxerr); System.out.println("at("+ib+","+iib+","+i3b+","+i4b+ ","+i5b+","+i6b+","+i7b+")"); } // end check_soln void write_soln(double U[]) // for plot7d_gl { double x, y, z, t, u, v, w; try { FileWriter fout = new FileWriter("pde47hn_eq_java.dat"); BufferedWriter fileout = new BufferedWriter(fout); System.out.println("writing pde47hn_eq_java.dat"); fileout.write("7 "+nx+" "+ny+" "+nz+" "+nt+" "+nu+" "+nv+" "+nw+"\n"); for(int i=0; i