// pde23js_la Galerkin FEM // solve ccxx*uxx+cyy*uyy+cczz*uzz+ccxy*uxy+ccxz*uxz+ // ccyz*uyz+ccx*ux+ccy*uy+ccz*uzcc*u=F(x,y,z) // given f(x,y,z) = // Analytic solution u(x,y,z) = boundary and check // inside nx by ny by nz grid, Gauss Legendre integration class pde23js_la { laphi L = new laphi(); pde23js_la() { double start, now; boolean debug = false; double ccxx = 1.0; // PDE definition double ccyy = 2.0; double cczz = 3.0; double ccxy = 4.0; double ccxz = 5.0; double ccyz = 6.0; double ccx = 7.0; double ccy = 8.0; double ccz = 9.0; double cc = 10.0; final int nx = 5; final int ny = 6; final int nz = 7; int nxyz = nx*ny*nz; double x, y, z, hx, hy, hz, tmp; int npx = 7; // Gauss Legendre integration order int npy = 8; int npz = 9; double xmin = 0.0; // problem parameters double xmax = 1.0; double ymin = 0.1; double ymax = 1.1; double zmin = 0.2; double zmax = 1.2; double val, err, avgerr, maxerr; double xg[] = new double[nx]; double yg[] = new double[ny]; double zg[] = new double[nz]; 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 kg[][] = new double[nxyz][nxyz]; double fg[] = new double[nxyz]; double ug[] = new double[nxyz]; double Ua[] = new double[nxyz]; System.out.print("pde23js_la.java running \n"); System.out.print("solve ccxx*uxx+cyy*uyy+cczz*uzz+ccxy*uxy+ccxz*uxz+\n"); System.out.print("ccyz*uyz+ccx*ux+ccy*uy+ccz*uz+cc*u=F(x,y,z)\n"); System.out.print("given F(x,y,z) \n"); System.out.print(" xmin<=x<=xmax ymin<=y<=ymax Boundaries \n"); System.out.print(" boundary and possibly check uana(x,y,z) \n"); System.out.print("ccxx="+ccxx+", ccyy="+ccyy+", cczz="+cczz+" \n"); System.out.print("ccxy="+ccxy+", ccxz="+ccxz+", ccyz="+ccyz+" \n"); System.out.print("ccx="+ccx+", ccy="+ccy+",ccz="+ccz+", cc="+cc+" \n"); System.out.print("xmin="+xmin+", xmax="+xmax+", nx="+nx+" \n"); System.out.print("ymin="+ymin+", ymax="+ymax+", ny="+ny+" \n"); System.out.print("zmin="+zmin+", zmax="+zmax+", nz="+nz+" \n"); System.out.print("npx="+npx+", npy="+npy+", npz="+npz+" \n"); start = System.currentTimeMillis()/1000.0; hx = (xmax-xmin)/(nx-1); for(int i=0; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.print("ug["+i+","+ii+","+iii+"]="+ug[S(i,ii,iii,ny,nz)]+ ", Ua="+Ua[S(i,ii,iii,ny,nz)]+", err="+ (ug[S(i,ii,iii,ny,nz)]-Ua[S(i,ii,iii,ny,nz)])+"\n"); } // iii } // ii } // i System.out.print(" maxerr="+maxerr+", avgerr="+ (avgerr/(nxyz))+"\n"); now = System.currentTimeMillis()/1000.0; System.out.println("total time "+(now-start)+" seconds"); System.out.print("pde23js_la.java finished\n"); } // end pde23js_la int S(int i, int ii, int iii, int ny, int nz) { // zero based index includes boundary, this is row of k[][] return i*(ny*nz)+ii*nz+iii; // index into us and ut, RHS } // end S // from uana23_fem.js problem definition double F(double x, double y, double z) // RHS { return 10.0*x*x + 10.0*x*y + 10.0*x*z + 10.0*y*y + 10.0*y*z + 10.0*z*z+ 31.0*x + 32.0*y + 33.0*z + 37.0; } // end f // Analytic solution double uana(double x, double y, double z) { return x*x+y*y+z*z+x*y+x*z+y*z+1.0; } // end u // needs laphi.java available // for finite element method (not needed if coefficients available) double galk(double x, double y, double z, int i, int ii, int iii, int j, int jj, int jjj, double ccxx, double ccyy, double cczz, double ccxy, double ccxz, double ccyz, double ccx, double ccy, double ccz, double cc, int nx, int ny, int nz, double xg[], double yg[], double zg[]) { // Galerkin k stiffness function for this problem return (ccxx * L.phipp(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + ccyy * L.phi(x,j,nx-1,xg)*L.phipp(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + cczz * L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)*L.phipp(z,jjj,nz-1,zg) + ccxy * L.phip(x,j,nx-1,xg)* L.phip(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + ccxz * L.phip(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phip(z,jjj,nz-1,zg) + ccyz * L.phi(x,j,nx-1,xg)* L.phip(y,jj,ny-1,yg)* L.phip(z,jjj,nz-1,zg) + ccx * L.phip(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + ccy * L.phi(x,j,nx-1,xg)* L.phip(y,jj,ny-1,yg)* L.phi(z,jjj,nz-1,zg) + ccz * L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg)* L.phip(z,jjj,nz-1,zg) + cc * 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, int i, int ii, int iii, int nx, int ny, int nz, double xg[], double yg[], double zg[]) { // 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) // "main" required { new pde23js_la(); // construct and execute } // end main } // end class pde23js_la