// pde46h_eq.java homogeneous Biharmonic PDE in six dimensions // solve Uvvvv(v,w,x,y,z,t) + Uwwww(v,w,x,y,z,t) + Uxxxx(v,w,x,y,z,t) + // Uyyyy(v,w,x,y,z,t) + Uzzzz(v,w,x,y,z,t) + Utttt(v,w,x,y,z,t) + // 2 Uvv(v,w,x,y,z,t) + 2 Uww(v,w,x,y,z,t) + 2 Uxx(v,w,x,y,z,t) + // 2 Uyy(v,w,x,y,z,t) + 2 Uzz(v,w,x,y,z,t) + 2 Utt(v,w,x,y,z,t) + // 6 U(v,w,x,y,z,t) = 0 // // boundary conditions computed using uana(v,w,x,y,z,t) // analytic solution is U(v,w,x,y,z,t) = sin(v+w+x+y+z+t) // // subscripts in code use v[i], w[ii], x[iii], y[iiii], z[iiiii], t[iiiiii] // // 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 // import java.text.*; import java.io.*; // uses rderiv.java // uses simeq.java class pde46h_eq { int nv = 6; int nw = 6; int nx = 6; int ny = 6; int nz = 6; int nt = 6; int nvwxyzt = (nv-2)*(nw-2)*(nx-2)*(ny-2)*(nz-2)*(nt-2); // DOF double A[] = new double[nvwxyzt*(nvwxyzt+1)]; // last column is RHS double U[] = new double[nvwxyzt]; // comupted solution, no boundary double vg[] = new double[nv]; // coordinates 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[nvwxyzt]; // analytic solution for checking, no bou double vmin = 0.0; // problem parameters double vmax = 1.5708; double wmin = 0.0; 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 hv, hw, hx, hy, hz, ht; pde46h_eq() { double v, w, x, y, z, t; int i,ii,iii,iiii,iiiii,iiiiii,j,jj,jjj,jjjj,jjjjj,jjjjjj; int k, cs; // coeficients of terms in first equation // derivative point arrays, dynamic in this version double cvv[] = new double[nv]; 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 cvvvv[] = new double[nv]; 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("pde46h_eq.java running "); System.out.println("Given uvvvv(v,w,x,y,z,t) + uwwww(v,w,x,y,z,t) + uxxxx(v,w,x,y,z,t) +"); System.out.println(" uyyyy(v,w,x,y,z,t) + uzzzz(v,w,x,y,z,t) + uzzzz(v,w,x,y,z,t) +"); System.out.println(" 2 uvv(v,w,x,y,z,t) + 2 uww(v,w,x,y,z,t) + 2 uxx(v,w,x,y,z,t) +"); System.out.println(" 2 uyy(v,w,x,y,z,t) + 2 uzz(v,w,x,y,z,t) + 2 utt(v,w,x,y,z,t) +"); System.out.println(" 6 u(v,w,x,y,z,t) = 0 "); System.out.println(" "); System.out.println("vmin<=v<=vmax wmin<=w<=wmax xmin<=x<=xmax "); System.out.println("ymin<=y<=ymax zmin<=z<=zmax tmin<=t<=tmax Boundaries "); System.out.println("Analytic solution U(v,w,x,y,z,t) = sin(v+w+x+y+z+t) "); System.out.println(" "); System.out.println("vmin="+vmin+", vmax="+vmax+ ", wmin="+wmin+", wmax="+wmax); 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("nv="+nv+", nw="+nw+", nx="+nx+", ny="+ny+ ", nz="+nz+", nt="+nt); time_start = (double)System.currentTimeMillis()/1000.0; System.out.println("time start="+time_start+" seconds"); System.out.println("DOF, degrees of freedom, nvwxyzt="+nvwxyzt); time_last = time_start; System.out.println(" "); System.out.println("v grid and analytic solution at minimums "); hv = (vmax-vmin)/(double)(nv-1); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+","+ii+","+iii+","+iiii+","+ iiiii+","+iiiiii+"]="+ U[s(i,ii,iii,iiii,iiiii,iiiiii)]+ ", Ua="+Ua[s(i,ii,iii,iiii,iiiii,iiiiii)]+ ", err="+err); } // 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)nvwxyzt)); System.out.println(" "); System.out.println("end pde46h_eq.java "); } // end pde46h_eq // utility functions int s(int i, int ii, int iii, int iiii, int iiiii, int iiiiii) // for v,w,x,y,z,t in loops for(int i=0; i=nvwxyzt) System.out.println("bad s("+i+","+ii+","+iii+ ","+iiii+","+iiiii+","+iiiiii+") ="+k); return k; } // end s int sk(int k, int i, int ii, int iii, int iiii, int iiiii, int iiiiii) // for v,w,x,y,z,t { return k*(nvwxyzt+1) + (i-1)*(nw-2)*(nx-2)*(ny-2)*(nz-2)*(nt-2) + (ii-1)*(nx-2)*(ny-2)*(nz-2)*(nt-2) + (iii-1)*(ny-2)*(nz-2)*(nt-2) + (iiii-1)*(nz-2)*(nt-2) + (iiiii-1)*(nt-2) + (iiiiii-1); } // end sk int ss(int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int j, int jj, int jjj, int jjjj, int jjjjj, int jjjjjj) { return s(i,ii,iii,iiii,iiiii,iiiiii)*(nvwxyzt+1) + s(j,jj,jjj,jjjj,jjjjj,jjjjjj); } // end ss double uana(double v, double w, double x, double y, double z, double t) //analytic solution and boundaries { return Math.sin(v+w+x+y+z+t); } // end uana double eval_derivative(int vord, int word, int xord, int yord, int zord, int tord, int i, int ii, int iii, int iiii, int iiiii, int iiiiii, double u[]) { int j, jj, jjj, jjjj, jjjjj, jjjjjj; double cv[] = new double[nv]; double cw[] = new double[nw]; double cx[] = new double[nx]; double cy[] = new double[ny]; double cz[] = new double[nz]; double ct[] = new double[nt]; double discrete; double v, w, x, y, z, t; new rderiv(vord, nv, i, hv, cv); v = vg[i]; new rderiv(word, nw, ii, hw, cw); w = wg[ii]; new rderiv(xord, nx, iii, hx, cx); x = xg[iii]; new rderiv(yord, ny, iiii, hy, cy); y = yg[iiii]; new rderiv(zord, nz, iiiii, hz, cz); z = zg[iiiii]; new rderiv(tord, nt, iiiiii, ht, ct); t = tg[iiiiii]; discrete = 0.0; // six cases of one partial v, w, x, y, z, t to any order if(vord!=0 && word==0 && xord==0 && yord==0 && zord==0 && tord==0) for(j=0; jsmaxerr) { smaxerr = err; ib = i; iib = ii; iiib = iii; iiiib = iiii; iiiiib = iiiii; iiiiiib = iiiiii; } } // end 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+","+iiiiiib+")"); } // end check_soln void write_soln(double u[]) // for plot6d_gl { double v, w, x, y, z, t; try { FileWriter fout = new FileWriter("pde46h_eq_java.dat"); BufferedWriter fileout = new BufferedWriter(fout); System.out.println("writing pde46h_eq_java.dat"); fileout.write("6 "+nv+" "+nw+" "+nx+" "+ny+" "+nz+" "+nt+"\n"); for(int i=0; i