// fem_check33_la.java Galerkin FEM // solve uxxx(x,y,z) + 2 uyyy(x,y,z) + 3 uzzz(x,y,z) + // 4 uxxy(x,y,z) + 5 uxxz(x,y,z) + 6 uyyx(x,y,z) + // 7 uyyz(x,y,z) + 8 uzzx(x,y,z) + 9 uzzy(x,y,z) + // 10 uxx(x,y,z) + 11 uyy(x,y,z) + 12 uzz(x,y,z) + // 13 uxy(x,y,z) + 14 uxz(x,y,z) + 15 uyz(x,y,z) + // 16 ux(x,y,z) + 17 uy(x,y,z) + 18 uz(x,y,z) + // 19 u(x,y,z) = F(x,y,z) // boundary conditions computed using u(x,y,z) // analytic solution may be given by u(x,y,z) = x^4 + 2 y^4 + 3 z^4 + // 4 x^2 y^2 z^2 + 5 x y + 6 x z + 7 y z + 8 // gauss-legendre integration used // solve for Uijk numerical approximation U(x_i,y_j,z_k) of u(x_i,y_j,z_k) // kg * ug = fg, solve simultaneous equations for U class fem_check33_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 nxyz = nx*ny*nz; double xg[] = new double[nx]; double yg[] = new double[ny]; double zg[] = new double[nz]; int i, j, ii, jj, iii, jjj; laphi L = new laphi(); fem_check33_la() { double x, y, z, hx, hy, hz; final int npx = 3; // Gauss Legendre integration order final int npy = 3; final int npz = 3; 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 val, err, avgerr, maxerr; int px, py, pz; 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 kg[] = new double[nxyz*nxyz]; double fg[] = new double[nxyz]; double ug[] = new double[nxyz]; double Ua[] = new double[nxyz]; double t_start, t_init, t_kf, t_simeq, t_end; System.out.println("fem_check33_la.c running"); System.out.println("Given uxxx(x,y,z) + 2 uyyy(x,y,z) + 3 uzzz(x,y,z) +"); System.out.println(" 4 uxxy(x,y,z) + 5 uxxz(x,y,z) + 6 uyyx(x,y,z) +"); System.out.println(" 7 uyyz(x,y,z) + 8 uzzx(x,y,z) + 9 uzzy(x,y,z) +"); System.out.println(" 10 uxx(x,y,z) + 11 uyy(x,y,z) + 12 uzz(x,y,z) +"); System.out.println(" 13 uxy(x,y,z) + 14 uxz(x,y,z) + 15 uyz(x,y,z) +"); System.out.println(" 16 ux(x,y,z) + 17 uy(x,y,z) + 18 uz(x,y,z) +"); System.out.println(" 19 u(x,y,z) = F(x,y,z)"); System.out.println("xmin<=x<=xmax ymin<=y<=ymax Boundaries "); System.out.println("Analytic solution u(x,y,z) = x^4 + 2 y^4 + 3 z^4 +"); System.out.println(" 4 x^2 y^2 z^2 + 5 x y + 6 x z + 7 y z + 8"); System.out.println(" "); System.out.println("xmin="+xmin+", xmax="+xmax+", ymin="+ymin+", ymax="+ymax); System.out.println("zmin="+zmin+", zmax="+zmax); System.out.println("nx="+nx+", ny="+ny+", nz="+nz); t_start = System.currentTimeMillis(); System.out.println("x grid and analytic solution at ymin,zmin "); hx = (xmax-xmin)/(double)(nx-1); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+","+ii+","+iii+"]="+ug[s(i,ii,iii)]+ ", Ua="+Ua[s(i,ii,iii)]+ ", err="+(ug[s(i,ii,iii)]-Ua[s(i,ii,iii)])); } } } System.out.println(" maxerr="+maxerr+", avgerr="+ avgerr/(double)(nxyz)); t_end = System.currentTimeMillis(); System.out.println("total took "+((t_end-t_start)/1000.0)+" seconds"); System.out.println(" "); } // end fem_check33_la constructor // utility functions to compute indices int s(int i, int ii, int iii) { return i*ny*nz+ii*nz+iii; } // end s int ss(int i, int ii, int iii, int j, int jj, int jjj) { return (i*ny*nz+ii*nz+iii)*nx*ny*nz+(j*ny*nz+jj*nz+jjj); } // end ss // PDE problem definition functions double F(double x, double y, double z) // forcing function, F(x,y,z) { return 406.0 + 208.0*x*y*z*z + 240.0*x*x*y*z + 88.0*x*x*z*z + 136.0*x*x*y*z*z + 128.0*x*y*y*z*z + 217.0*x + 302.0*y + 80.0*y*y*z*z + 144.0*x*x*y*y*z + 96.0*x*x*y*y + 224.0*x*y*y*z + 76.0*x*x*y*y*z*z + 144.0*x*x*y + 80.0*y*y*z + 64.0*y*z*z + 133.0*y*z + 128.0*x*y*y + 112.0*x*x*z + 96.0*x*z*z + 114.0*x*z + 95.0*x*y + 431.0*z + 19.0*x*x*x*x + 38.0*y*y*y*y + 57.0*z*z*z*z + 64.0*x*x*x + 136.0*y*y*y + 216.0*z*z*z + 120.0*x*x + 264.0*y*y + 432.0*z*z; } double uana(double x, double y, double z) // analytic solution and boundaries { return x*x*x*x + 2.0*y*y*y*y + 3.0*z*z*z*z + 4.0*x*x*y*y*z*z + 5.0*x*y + 6.0*x*z + 7.0*y*z + 8.0; } double galk(double x, double y, double z) { // Galerkin k stiffness function for this problem return ( 1.0*L.phippp(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + 2.0* L.phi(x,j,nx-1,xg)*L.phippp(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + 3.0* L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phippp(z,jjj,nz-1,zg) + 4.0* L.phipp(x,j,nx-1,xg)* L.phip(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + 5.0* L.phipp(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phip(z,jjj,nz-1,zg) + 6.0* L.phip(x,j,nx-1,xg)* L.phipp(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + 7.0* L.phi(x,j,nx-1,xg)* L.phipp(y,jj,ny-1,yg)* L.phip(z,jjj,nz-1,zg) + 8.0* L.phip(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phipp(z,jjj,nz-1,zg) + 9.0* L.phi(x,j,nx-1,xg)* L.phip(y,jj,ny-1,yg)* L.phipp(z,jjj,nz-1,zg) + 10.0* L.phipp(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + 11.0* L.phi(x,j,nx-1,xg)* L.phipp(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + 12.0* L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phipp(z,jjj,nz-1,zg) + 13.0* L.phip(x,j,nx-1,xg)* L.phip(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + 14.0* L.phip(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phip(z,jjj,nz-1,zg) + 15.0* L.phi(x,j,nx-1,xg)* L.phip(y,jj,ny-1,yg)* L.phip(z,jjj,nz-1,zg) + 16.0* L.phip(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + 17.0* L.phi(x,j,nx-1,xg)* L.phip(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + 18.0* L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phip(z,jjj,nz-1,zg) + 19.0* L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg))* (L.phi(x,i,nx-1,xg)* L.phi(y,ii,ny-1,yg)* L.phi(z,iii,nz-1,zg)); } // end galk used by integration double galf(double x, double y, double z) // Galerkin f function for this problem { return F(x,y,z)*L.phi(x,i,nx-1,xg)*L.phi(y,ii,ny-1,yg)*L.phi(z,iii,nz-1,zg); } // end galf used by integration public static void main (String[] args) { new fem_check33_la(); } } // end class fem_check33_la