// Pde34_nuderiv4d.java // third order pde with third degree solution, 4D // sufficient points must be available for each order,degree // // given a PDE, a scatering of points in 4D, boundary values, // // solve uxxx(x,y,z,t) + 2 uyyy(x,y,z,t) + 3 uzzz(x,y,z,t) + // 4 uttt(x,y,z,t) + 5 uxyt(x,y,z,t) + 6 uyyz(x,y,z,t) + // 7 uztt(x,y,z,t) + 8 uyzt(x,y,z,t) + 9 uyyt(x,y,z,t) + // 10 ut(x,y,z,t) + 11 u(x,y,z,t) = F(x,y,z,t) // F(x,y,z,t) = 608 + 30*t*t + 60*y*y + 70*x*y + 80*y*z + // 11*t*t*t + 22*z*z*z + 33*y*y*y + 44*x*x*x + 55*y*y*z + // 66*y*y*t + 77*x*y*t + 88*y*z*t + 99*x*z + 110*t // // // boundary conditions computed using u(x,y,z,t) // analytic solution is uana(x,y,z,t) = t*t*t + 2*z*z*z + 3*y*y*y + 4*x*x*x + // 5*y*y*z + 6*y*y*t + 7*x*y*t + 8*y*z*t + // 9*x*z +10*t +11; // soultion, generally not known // used to compute boundary values // used for error checking // U(xf,yf,zf,tf) unknown at nfree vertices, DOF // U(xb,yb,zb,tb) known at nbound boundary vertices, nvert total vertices // nuderiv4d determines cxxx, cyyy, czzz, cttt, ... // at a subset of vertices // Uxxx(xf,yf,zf,tf)= cxxx(xf,yf,zf,tf)*U(xf,yf,zf,tf)+ unknown U // cxxx(xfi,yfi,zfi,tfi)*U(xfi,yfi,zfi.tfi)+...+ // unknown U(xfi,yfi,zfi,tfi) for each xf,yf,zf,tf // cxxx(xbj,ybj,zbj,tbj)*U(xbj,ybj,zbj,tbj)+... // known value // ... // f(xf,yf,zf,tf) right hand side, known, computable // // substituting in the PDE, a set of linear simultaneous equations for U(xf,yf) // | a11 a12 ... a1n | |U(xf1,yf1,zf1,tf1)| = rhs(1) n = nfree // | a21 a22 ... a2n | * |U(xf2,yf2,zf2,tf2)| = rhs(2) // ... // | an1 an2 ... ann | |U(xfn,yfn,zfn,tfn)| = rhs(n) // // // rhs(1) = f(xf1,yf1,zf1,tf1) - cxxx(xbj,ybj,zbj,tbj)*U(xbj,ybj,zbj,tbj) - // // same code for a21, a22, ... new N.nuderiv4d on next point // then rest of DOF points // solve for U(xfi,yfi) i=1..nfree public strictfp class pde34_nuderiv4d { int debug = 1; int nvert = 70; // number of unique vertices double x[] = new double[nvert]; double y[] = new double[nvert]; double z[] = new double[nvert]; double t[] = new double[nvert]; int uniqueb[] = new int[nvert]; // boundary vertices int nfree = 1; // degrees of freedom, must be first vertices int nbound = nvert-nfree; // number of boundary vertices double t_start, t_init, t_kf, t_simeq, t_end; pde34_nuderiv4d() { int order = 3; int m; final int nc=70; double ct[] = new double[nc]; double cxxx[] = new double[nc]; double cxyt[] = new double[nc]; double cyyy[] = new double[nc]; double cyyz[] = new double[nc]; double cyyt[] = new double[nc]; double cyzt[] = new double[nc]; double czzz[] = new double[nc]; double cztt[] = new double[nc]; double cttt[] = new double[nc]; int ip[] = new int[nc]; double ap; double error, maxerror; double xmin, xmax, ymin, ymax, zmin, zmax, tmin, tmax, umin, umax; t_start = System.currentTimeMillis(); System.out.println("pde34_nuderiv4d.java running"); System.out.println(" uxxx(x,y,z,t) + 2 uyyy(x,y,z,t) + 3 uzzz(x,y,z,t) +"); System.out.println("4 uttt(x,y,z,t) + 5 uxyt(x,y,z,t) + 6 uyyz(x,y,z,t) +"); System.out.println("7 uztt(x,y,z,t) + 8 uyzt(x,y,z,t) + 9 uyyt(x,y,z,t) +"); System.out.println("10 ut(x,y,z,t) + 11 u(x,y,z,t) = F(x,y,z,t)"); System.out.println("F(x,y,z,t) = "); System.out.println(" 608 + 30*t*t + 60*y*y + 70*x*y + 80*y*z + "); System.out.println("11*t*t*t + 22*z*z*z + 33*y*y*y + 44*x*x*x + 55*y*y*z+"); System.out.println("66*y*y*t + 77*x*y*t + 88*y*z*t + 99*x*z + 110*t "); System.out.println(" "); System.out.println("uana(x,y)=t^3 + 2 z^3 + 3 y^3 + 4 x^3 +"); System.out.println(" 5 y^2 z + 6 y y t + 7 x y t + 8 y z t +"); System.out.println(" 9 x z 10 t + 11 boundary and solution"); nuderiv4d N = new nuderiv4d(); double U[] = new double[nvert]; // known boundary double A[][] = new double[nfree][nfree]; // matrix double rhs[] = new double[nfree]; // right hand side, forcing function double ug[] = new double[nfree]; // solution computed // read in or generate data points, DOF (free) first, then boundary gen_data4(1); // initialize vertices xmin = x[0]; xmax = x[0]; ymin = y[0]; ymax = y[0]; zmin = z[0]; zmax = z[0]; tmin = t[0]; tmax = t[0]; System.out.println("vertex, x, y"); for(int i=0; i