// fem_check44_la.java Galerkin FEM // solve uxxxx(x,y,z,t) + 2 uyyyy(x,y,z,t) + 3 uzzzz(x,y,z,t) + // 4 utttt(x,y,z,t) + 5 uxyt(x,y,z,t) + 6 uyyzz(x,y,z,t) + // 7 uztt(x,y,z,t) + 8 uxxx(x,y,z,t) + 9 uyyt(x,y,z,t) + // 10 uzt(x,y,z,t) + 11 ut(x,y,z,t) + 12 u(x,y,z,t) = // F(x,y,z,t) // F(x,y,z,t) = 706 + 120 t^2 + 140 y^2z + 768 x + // 180 z^2*t + 200 y^2z*t + 44 t^3 + // 110 y^2z^2t + 66 xy + 12t^4 + // 24 z^4 + 36 y^4 + 48 x^4 + // 60 y^2z^2t^2 + 72 xyt + 84 xz + 96 t // // boundary conditions computed using u(x,y,z,t) // analytic solution is u(x,y,z,t) = t^4 + 2 z^4 + 3 y^4 + 4 x^4 + // 5 y^2 z^2 t^2 + 6 x y t + // 7 x z + 8 t + 9 // gauss-legendre integration used // solve for Uijkl numerical approximation U(x_i,y_j,z_k,t_l) // kg * ug = fg, solve simultaneous equations for U class fem_check44_la { // i, j, nx, ii, jj, ny, xg, yg needed by galk or galf, available at call final int nx = 5; final int ny = 5; final int nz = 5; final int nt = 5; final int nxyzt = nx*ny*nz*nt; double xg[] = new double[nx]; double yg[] = new double[ny]; double zg[] = new double[nz]; double tg[] = new double[nt]; int i, j, ii, jj, iii, jjj, iiii, jjjj; laphi L = new laphi(); fem_check44_la() { double x, y, z, t, hx, hy, hz, ht; final int npx = 12; // Gauss Legendre integration order final int npy = 12; final int npz = 12; final int npt = 12; double xx[] = new double[npx+1]; double wx[] = new double[npx+1]; // for Gauss-Legendre double yy[] = new double[npy+1]; double wy[] = new double[npy+1]; // for Gauss-Legendre double zz[] = new double[npz+1]; double wz[] = new double[npz+1]; // for Gauss-Legendre double tt[] = new double[npt+1]; double wt[] = new double[npt+1]; // for Gauss-Legendre double val, err, avgerr, maxerr; int px, py, pz, pt; double xmin = 0.0; // problem parameters double xmax = 1.0; double ymin = 0.0; double ymax = 1.0; double zmin = 0.0; double zmax = 1.0; double tmin = 0.0; double tmax = 1.0; double kg[] = new double[nxyzt*nxyzt]; double fg[] = new double[nxyzt]; double ug[] = new double[nxyzt]; double Ua[] = new double[nxyzt]; double t_start, t_init, t_kf, t_simeq, t_end; System.out.println("fem_check44_la.c running"); System.out.println("Given uxxxx(x,y,z,t) + 2 uyyyy(x,y,z,t) + 3 uzzzz(x,y,z,t) +"); System.out.println(" 4 utttt(x,y,z,t) + 5 uxyt(x,y,z,t) + 6 uyyzz(x,y,z,t) +"); System.out.println(" 7 uztt(x,y,z,t) + 8 uxxx(x,y,z,t) + 9 uyyt(x,y,z,t) +"); System.out.println(" 10 uzt(x,y,z,t) + 11 ut(x,y,z,t) + 12 u(x,y,z,t) ="); System.out.println(" F(x,y,z,t)"); System.out.println(" F(x,y,z,t) = 706 + 120 t^2 + 140 y^2z + 768 x + "); System.out.println(" 180 z^2*t + 200 y^2z*t + 44 t^3 + "); System.out.println(" 110 y^2z^2t + 66 xy + 12t^4 + "); System.out.println(" 24 z^4 + 36 y^4 + 48 x^4 + "); System.out.println(" 60 y^2z^2t^2 + 72 xyt + 84 xz + 96 t"); System.out.println("xmin<=x<=xmax ymin<=y<=ymax zmin<=z<=zmax Boundaries"); System.out.println("Analytic solution u(x,y,z,t) = t^4 + 2 z^4 + 3 y^4 +"); System.out.println(" 4 x^4 + 5 y^2 z^2 t^2 + 6 x y t + 7 x z + 8 t + 9"); 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("nx="+nx+", ny="+ny+", nz="+nz+", nt="+nt); t_start = System.currentTimeMillis(); System.out.println("x grid and analytic solution at ymin,zmin,tmin "); hx = (xmax-xmin)/(double)(nx-1); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+","+ii+","+iii+","+iiii+"]="+ ug[s(i,ii,iii,iiii)]+ ", Ua="+Ua[s(i,ii,iii,iiii)]+ ", err="+(ug[s(i,ii,iii,iiii)]-Ua[s(i,ii,iii,iiii)])); } } } } System.out.println(" maxerr="+maxerr+", avgerr="+ avgerr/(double)(nxyzt)); t_end = System.currentTimeMillis(); System.out.println("total took "+((t_end-t_start)/1000.0)+" seconds"); System.out.println(" "); } // end fem_check44_la constructor // utility functions to compute indices int s(int i, int ii, int iii, int iiii) { return i*ny*nz*nt+ii*nz*nt+iii*nt+iiii; } // end s int ss(int i, int ii, int iii, int iiii, int j, int jj, int jjj, int jjjj) { return (i*ny*nz*nt+ii*nz*nt+iii*nt+iiii)*nx*ny*nz*nt+ (j*ny*nz*nt+jj*nz*nt+jjj*nt+jjjj); } // end ss // PDE problem definition functions double F(double x, double y, double z, double t) // forcing function, F(x,y,z,t) { return 706.0 + 120.0*t*t + 140.0*y*y*z + 768.0*x + 180.0*z*z*t + 200.0*y*y*z*t + 44.0*t*t*t + 110.0*y*y*z*z*t + 66.0*x*y + 12.0*t*t*t*t + 24.0*z*z*z*z + 36.0*y*y*y*y + 48.0*x*x*x*x + 60.0*y*y*z*z*t*t + 72.0*x*y*t + 84.0*x*z + 96.0*t; } double uana(double x, double y, double z, double t) // analytic solution and boundaries { return t*t*t*t + 2.0*z*z*z*z + 3.0*y*y*y*y + 4.0*x*x*x*x + 5.0*y*y*z*z*t*t + 6.0*x*y*t + 7.0*x*z + 8.0*t + 9.0; } double galk(double x, double y, double z, double t) // Galerkin k stiffness function for this problem { return (L.phipppp(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg)+ 2.0* L.phi(x,j,nx-1,xg)*L.phipppp(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg)+ 3.0* L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)*L.phipppp(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg)+ 4.0* L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg)* L.phipppp(t,jjjj,nt-1,tg)+ 5.0* L.phip(x,j,nx-1,xg)* L.phip(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg)* L.phip(t,jjjj,nt-1,tg)+ 6.0* L.phi(x,j,nx-1,xg)* L.phipp(y,jj,ny-1,yg)* L.phipp(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg)+ 7.0* L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phip(z,jjj,nz-1,zg)* L.phipp(t,jjjj,nt-1,tg)+ 8.0* L.phippp(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg)+ 9.0* L.phi(x,j,nx-1,xg)* L.phipp(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg)* L.phip(t,jjjj,nt-1,tg)+ 10.0* L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phip(z,jjj,nz-1,zg)* L.phip(t,jjjj,nt-1,tg)+ 11.0* L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg)* L.phip(t,jjjj,nt-1,tg)+ 12.0* L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg))* (L.phi(x,i,nx-1,xg)* L.phi(y,ii,ny-1,yg)* L.phi(z,iii,nz-1,zg)* L.phi(t,iiii,nt-1,tg)); } // end galk used by integration double galf(double x, double y, double z, double t) // Galerkin f function for this problem { return F(x,y,z,t)*L.phi(x,i,nx-1,xg)*L.phi(y,ii,ny-1,yg)*L.phi(z,iii,nz-1,zg)* L.phi(t,iiii,nt-1,tg); } // end galf used by integration public static void main (String[] args) { new fem_check44_la(); } } // end class fem_check44_la