// pde49hn_eq.java Biharmonic PDE in nine dimensions // solve Uxxxx(x,y,z,t,u,v,w,p,q) + Uyyyy(x,y,z,t,u,v,w,p,q) + // Uzzzz(x,y,z,t,u,v,w,p,q) + Utttt(x,y,z,t,u,v,w,p,q) + // Uuuuu(x,y,z,t,u,v,w,p,q) + Uvvvv(x,y,z,t,u,v,w,p,q) + // Uwwww(x,y,z,t,u,v,w,p,q) + Upppp(x,y,z,t,u,v,w,p,q) + // Uqqqq(x,y,z,t,u,v,w,p,q) + // 2 Uxx(x,y,z,t,u,v,w,p,q) + 2 Uyy(x,y,z,t,u,v,w,p,q) + // 2 Uzz(x,y,z,t,u,v,w,p,q) + 2 Utt(x,y,z,t,u,v,w,p,q) + // 2 Uuu(x,y,z,t,u,v,w,p,q) + 2 Uvv(x,y,z,t,u,v,w,p,q) + // 2 Uww(x,y,z,t,u,v,w,p,q) + 2 Upp(x,y,z,t,u,v,w,p,q) + // 2 Uqq(x,y,z,t,u,v,w,p,q) + // 10 U(x,y,z,t,u,v,w,p,q) = f(x,y,z,t,u,v,w,p,q) // // boundary conditions computed using Ub(x,y,z,t,u,v,w,p,q) // analytic solution is U(x,y,z,t,u,v,w,p,q) = sin(x+y+z+t+u+v+w+p+q) // // subscripts in code use x[i], y[ii], z[i3], t[i4], u[i5], // v[i6], w[i7], p[18], q[i9] // // replace continuous derivatives with discrete derivatives // solve for U(x,y,z,t,u,v,w,p,q) numerical approximation U // A * U = F, solve simultaneous equations for U // import java.text.*; import java.io.*; // uses rderiv.java // uses simeq.java class pde49hn_eq { int nx = 5; int ny = 5; int nz = 5; int nt = 5; int nu = 5; int nv = 5; int nw = 5; int np = 5; int nq = 5; int ndof = (nx-2)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2); double A[] = new double[ndof*(ndof+1)]; // last column is RHS double U[] = new double[ndof]; // 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 pg[] = new double[np]; double qg[] = new double[nq]; double Ua[] = new double[ndof]; // 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 pmin = 0.0; double pmax = 0.5; double qmin = 0.0; double qmax = 0.5; double hx, hy, hz, ht, hu, hv, hw, hp, hq; pde49hn_eq() { double x, y, z, t, u, v, w, p, q; int i,ii,i3,i4,i5,i6,i7,i8,i9, j,jj,j3,j4,j5,j6,j7,j8,j9; 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 cpp[] = new double[np]; double cqq[] = new double[nq]; 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 cpppp[] = new double[np]; double cqqqq[] = new double[nq]; double val, err, avgerr, maxerr; double time_start; double time_now; double time_last; System.out.println("pde49hn_eq.java running "); System.out.println("Given Uxxxx(x,y,z,t,u,v,w,p,q) + Uyyyy(x,y,z,t,u,v,w,p,q) + Uzzzz(x,y,z,t,u,v,w,p,q) +"); System.out.println(" Utttt(x,y,z,t,u,v,w,p,q) + Uuuuu(x,y,z,t,u,v,w,p,q) + Uvvvv(x,y,z,t,u,v,w,p,q) +"); System.out.println(" Uwwww(x,y,z,t,u,v,w,p,q) + Upppp(x,y,z,t,u,v,w,p,q) + Uqqqq(x,y,z,t,u,v,w,p,q) +"); System.out.println(" 2 Uxx(x,y,z,t,u,v,w,p,q) + 2 Uyy(x,y,z,t,u,v,w,p,q) + 2 Uzz(x,y,z,t,u,v,w,p,q) +"); System.out.println(" 2 Utt(x,y,z,t,u,v,w,p,q) + 2 Uuu(x,y,z,t,u,v,w,p,q) + 2 Uvv(x,y,z,t,u,v,w,p,q) +"); System.out.println(" 2 Uww(x,y,z,t,u,v,w,p,q) + 2 Upp(x,y,z,t,u,v,w,p,q) + 2 Uqq(x,y,z,t,u,v,w,p,q) +"); System.out.println(" 10 U(x,y,z,t,u,v,w,p,q) = f(x,y,z,t,u,v,w,p,q) "); 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 pmin<=p<=pmax qmin<=q<=qmax Boundaries "); System.out.println("Analytic solution U(x,y,z,t,u,v,w,p,q) = sin(x+y+z+t+u+v+w+p+q) "); 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+ ", pmin="+pmin+", pmax="+pmax); System.out.println("qmin="+qmin+", qmax="+qmax); System.out.println("nx="+nx+", ny="+ny+", nz="+nz+", nt="+nt+ ", nu="+nu+", nv="+nv+", nw="+nw+", np="+np+ ", nq="+nq); time_start = (double)System.currentTimeMillis()/1000.0; System.out.println("time start="+time_start+" seconds"); System.out.println("DOF, degrees of freedom, ndof="+ndof); 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+","+pmin+","+qmin+")="+ Ub(xg[i],ymin,zmin,tmin,umin,vmin,wmin,pmin,qmin)); for(i=1; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+","+ii+","+i3+","+i4+","+ i5+","+i6+","+i7+","+i8+","+i9+"]="+ U[s(i,ii,i3,i4,i5,i6,i7,i8,i9)]+ ", Ua="+Ua[s(i,ii,i3,i4,i5,i6,i7,i8,i9)]+ ", err="+err); } // i9 } // i8 } // 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)ndof)); System.out.println(" "); System.out.println("end pde49hn_eq.java "); } // end pde49hn_eq // utility functions int s(int i, int ii, int i3, int i4, int i5, int i6, int i7, int i8, int i9) // for x,y,z,t,u,v,w,p,q in loops for(int i=0; i=ndof) System.out.println("bad s("+i+","+ii+","+i3+ ","+i4+","+i5+","+i6+","+i7+","+i8+","+i9+") ="+k); return k; } // end s int sk(int k, int i, int ii, int i3, int i4, int i5, int i6, int i7, int i8, int i9) // for x,y,z,t,u,v,w,p,q { return k*(ndof+1) + (i -1)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (ii-1)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i3-1)*(nt-2)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i4-1)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i5-1)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i6-1)*(nw-2)*(np-2)*(nq-2) + (i7-1)*(np-2)*(nq-2) + (i8-1)*(nq-2) + (i9-1); } // end sk int ss(int i, int ii, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int j, int jj, int j3, int j4, int j5, int j6, int j7, int j8, int j9) { return s(i,ii,i3,i4,i5,i6,i7,i8,i9)*(ndof+1) + s(j,jj,j3,j4,j5,j6,j7,j8,j9); } // end ss double Ub(double x, double y, double z, double t, double u, double v, double w, double p, double q) //analytic solution and boundaries { return Math.sin(x+y+z+t+u+v+w+p+q); } // end Ub double f(double x, double y, double z, double t, double u, double v, double w, double p, double q) //analytic solution and boundaries { return Math.sin(x+y+z+t+u+v+w+p+q); } // end f double eval_derivative(int xord, int yord, int zord, int tord, int uord, int vord, int word, int pord, int qord, int i, int ii, int i3, int i4, int i5, int i6, int i7, int i8, int i9, double U[]) { int j, jj, j3, j4, j5, j6, j7, j8, j9; 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 cp[] = new double[np]; double cq[] = new double[nq]; double discrete; double x, y, z, t, u, v, w, p, q; new rderiv(xord, nx, i, hx, cx); x = xg[i]; new rderiv(yord, ny, ii, hy, cy); y = yg[ii]; new rderiv(word, 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[i7]; new rderiv(pord, np, i8, hp, cp); p = pg[i8]; new rderiv(qord, nq, i9, hq, cq); q = qg[i9]; discrete = 0.0; // seven cases of one partial x, y, z, t, u, v, w, p to any order if(xord!=0 && yord==0 && zord==0 && tord==0 && uord==0 && vord==0 && word==0 && pord==0 && qord==0) for(j=0; jsmaxerr) { smaxerr = err; ib = i; iib = ii; i3b = i3; i4b = i4; i5b = i5; i6b = i6; i7b = i7; i8b = i8; i9b = i9; } } // end i9 } // end i8 } // 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+","+i8b+","+i9b+")"); } // end check_soln void write_soln(double U[]) // for plot9d_gl { double x, y, z, t, u, v, w, p, q; try { FileWriter fout = new FileWriter("pde49hn_eq_java.dat"); BufferedWriter fileout = new BufferedWriter(fout); System.out.println("writing pde49hn_eq_java.dat"); fileout.write("9 "+nx+" "+ny+" "+nz+" "+nt+" "+nu+" "+nv+" "+nw+" "+np+" "+nq+"\n"); for(int i=0; i