// fem_check44_pla.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 // needs psimeq, laphi, gaulegf import java.util.concurrent.*; // uses barrier.await() and others class fem_check44_pla { final int NP = 4; // number of processors CyclicBarrier barrieri1; CyclicBarrier barrieri2; final int nx = 5; final int ny = 5; final int nz = 5; final int nt = 5; final int nxyzt = nx*ny*nz*nt; double kg[] = new double[nxyzt*nxyzt]; // stifness matrix double fg[] = new double[nxyzt]; // RHS double ug[] = new double[nxyzt]; // computed solution double Ua[] = new double[nxyzt]; // check solution double xg[] = new double[nx]; double yg[] = new double[ny]; double zg[] = new double[nz]; double tg[] = new double[nt]; laphi L = new laphi(); final int npx = 5; // Gauss Legendre integration order final int npy = 5; final int npz = 5; final int npt = 5; 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 class Integrate extends Thread { int myid; double val; Integrate(int id) { myid = id; } public void run() { try { System.out.println("Integrate "+myid+" at i1 await"); barrieri1.await(); System.out.println("Integrate "+myid+" after i1 await"); int i = myid; // could be many for(int j=0; jmaxerr) 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_pla 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, int i, int j, int ii, int jj, int iii, int jjj, int iiii, int jjjj) // 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, int i, int ii, int iii, int iiii) // 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_pla(); } } // end class fem_check44_pla