// fem_check47h_la.java Galerkin FEM // Biharmonic 4th order 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) // // F(x,y,z,t,u,v,w) = sin(x+y+z+t+u+v+w) // // boundary conditions computed using uana(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[i2], z[i3], t[i4], u[i5], v[i6], w[i7] // // using Lagrange Phi functions and Gauss-Legendre integration // solve for U numerical approximation U(x_i,y_i2,z_i3,t_i4,u_i5,v_i6,w_i7) // kg * uu = fg, solve simultaneous equations for U // class fem_check47h_la { final int nx = 3; final int ny = 3; final int nz = 3; final int nt = 3; final int nu = 3; final int nv = 3; final int nw = 3; final int nxyztuvw = nx*ny*nz*nt*nu*nv*nt; double xg[] = new double[nx]; 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]; int i, j, i2, j2, i3, j3, i4, j4, i5, j5, i6, j6, i7, j7; laphi L = new laphi(); fem_check47h_la() { double x, y, z, t, u, v, w, hx, hy, hz, ht, hu, hv, hw; final int npx = 8; // Gauss Legendre integration order final int npy = 8; final int npz = 8; final int npt = 8; final int npu = 8; final int npv = 8; final int npw = 8; double xx[] = new double[npx+1]; // for Gauss-Legendre double wx[] = new double[npx+1]; double yy[] = new double[npy+1]; double wy[] = new double[npy+1]; double zz[] = new double[npz+1]; double wz[] = new double[npz+1]; double tt[] = new double[npt+1]; double wt[] = new double[npt+1]; double uuu[] = new double[npu+1]; double wu[] = new double[npu+1]; double vv[] = new double[npv+1]; double wv[] = new double[npv+1]; double www[] = new double[npw+1]; double ww[] = new double[npw+1]; double val, err, avgerr, maxerr; int px, py, pz, pt, pu, pv, pw; 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 kg[][] = new double[nxyztuvw][nxyztuvw]; double fg[] = new double[nxyztuvw]; double uu[] = new double[nxyztuvw]; double Ua[] = new double[nxyztuvw]; double tstart, tnow; tstart = System.currentTimeMillis(); System.out.println("fem_check47h_la.java running "); System.out.println("Given Uxxxx(x,y,z,t,u,v,w) + Uyyyy(x,y,z,t,u,v,w) +"); System.out.println(" Uzzzz(x,y,z,t,u,v,w) + Utttt(x,y,z,t,u,v,w) +"); System.out.println(" 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) +"); System.out.println(" 2 Uzz(x,y,z,t,u,v,w) + 2 Utt(x,y,z,t,u,v,w) +"); System.out.println(" 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("F(x,y,z,t,u,v,w) = sin(x+y+z+t+u+v+w)"); System.out.println(" "); System.out.println("Biharmonic 4th order PDE in seven dimensions"); System.out.println("Solve by Galerkin Finite Element Method"); System.out.println("using Lagrange Phi functions and Gauss-Legendre integration"); 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); System.out.println("nu="+nu+", nv="+nv+", nw="+nw); System.out.println("x grid and analytic solution "); hx = (xmax-xmin)/(double)(nx-1); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("uu["+i+","+i2+","+i3+","+i4+","+i5+","+i6+","+i7+ "]="); System.out.println(+uu[s(i,i2,i3,i4,i5,i6,i7)]+ ", Ua="+Ua[s(i,i2,i3,i4,i5,i6,i7)]+ ", abserr="+err); } } } } } } } System.out.println("nx="+nx+", ny="+ny+", nz="+nz+", nt="+nt); System.out.println("nu="+nu+", nv="+nv+", nw="+nw); System.out.println("npx="+npx+", npy="+npy+", npz="+npz+", npt="+npt); System.out.println("npu="+npu+", npv="+npv+", npw="+npw); System.out.println(" maxerr="+maxerr+", avgerr="+ avgerr/(double)(nxyztuvw)); tnow = System.currentTimeMillis(); System.out.println("total time "+((tnow-tstart)/3600000.0)+ " hours"); } // end fem_check47h_la constructor // indexing function returne 0 to nxyztuvw-1 int s(int i, int i2, int i3, int i4, int i5, int i6, int i7) { // row or column index to kg, index to uu and fg return i*ny*nz*nt*nu*nv*nw + i2*nz*nt*nu*nv*nw + i3*nt*nu*nv*nw + i4*nu*nv*nw + i5*nv*nw + i6*nw + i7; } // end s // PDE problem definition functions double F(double x, double y, double z, double t, double u, double v, double w) { return Math.sin(x+y+z+t+u+v+w); } double uana(double x, double y, double z, double t, double u, double v, double w) { return Math.sin(x+y+z+t+u+v+w); } double galk(double x, double y, double z, double t, double u, double v, double w) { // Galerkin k stiffness function for this problem return ( L.phipppp(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ L.phi(x,j,nx-1,xg)* L.phipppp(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ L.phi(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phipppp(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ L.phi(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phipppp(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ L.phi(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phipppp(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ L.phi(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phipppp(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ L.phi(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phipppp(w,j7,nw-1,wg)+ 2.0*L.phipp(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ 2.0*L.phi(x,j,nx-1,xg)* L.phipp(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ 2.0*L.phi(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phipp(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ 2.0*L.phi(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phipp(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ 2.0*L.phi(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phipp(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ 2.0*L.phi(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phipp(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg)+ 2.0*L.phi(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phipppp(w,j7,nw-1,wg)+ 8.0*L.phi(x,j,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)* L.phi(u,j5,nu-1,ug)* L.phi(v,j6,nv-1,vg)* L.phi(w,j7,nw-1,wg) )* (L.phi(x,i,nx-1,xg)* L.phi(y,i2,ny-1,yg)* L.phi(z,i3,nz-1,zg)* L.phi(t,i4,nt-1,tg)* L.phi(u,i5,nu-1,ug)* L.phi(v,i6,nv-1,vg)* L.phi(w,i7,nw-1,wg) ); } // end galk used by integration double galf(double x, double y, double z, double t, double u, double v, double w) { // Galerkin f function for this problem return F(x,y,z,t,u,v,w)* L.phi(x,i ,nx-1,xg)*L.phi(y,i2,ny-1,yg)*L.phi(z,i3,nz-1,zg)* L.phi(t,i4,nt-1,tg)*L.phi(u,i5,nu-1,ug)*L.phi(v,i6,nv-1,vg)* L.phi(w,i7,nw-1,wg); } // end galf used by integration public static void main (String[] args) { new fem_check47h_la(); } } // end class fem_check47h_la