// pde24js_la Galerkin FEM // solve ccxx*uxx+ccyy*uyy+cczz*uzz+cctt*utt+ccxy*uxy+ccxz*uxz+ // ccxt*uxt+ccyz*uyz+ccyt*uyt+cczt*uzt+ // ccx*ux+ccy*uy+ccz*uz+cct*ut+cc*u=F(x,y,z,t) // given f(x,y,z,t) = // Analytic solution u(x,y,z,t) = boundary and check // inside nx by ny by nz by nt grid, Gauss Legendre integration class pde24js_la { laphi L = new laphi(); pde24js_la() { double start, prev, now; boolean debug = false; double ccxx = 1.0; // PDE definition double ccyy = 2.0; double cczz = 3.0; double cctt = 4.0; double ccxy = 5.0; double ccxz = 6.0; double ccxt = 7.0; double ccyz = 8.0; double ccyt = 9.0; double cczt = 10.0; double ccx = 11.0; double ccy = 12.0; double ccz = 13.0; double cct = 14.0; double cc = 15.0; final int nx = 5; final int ny = 5; final int nz = 5; final int nt = 5; int nxyzt = nx*ny*nz*nt; double x, y, z, t, hx, hy, hz, ht, tmp; int npx = 7; // Gauss Legendre integration order int npy = 7; int npz = 7; int npt = 7; 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 tmin = 0.3; double tmax = 1.3; double val, err, avgerr, maxerr; double xg[] = new double[nx]; double yg[] = new double[ny]; double zg[] = new double[nz]; double tg[] = new double[nt]; 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 kg[][] = new double[nxyzt][nxyzt]; double fg[] = new double[nxyzt]; double ug[] = new double[nxyzt]; double Ua[] = new double[nxyzt]; System.out.print("pde24js_la.js running \n"); System.out.print("solve ccxx*uxx+ccyy*uyy+cczz*uzz+cctt*utt+ccxy*uxy+\n"); System.out.print("ccxz*uxz+ccxt*uxt+ccyz*uyz+ccyt*uyt+cczt*uzt+ \n"); System.out.print("ccx*ux+ccy*uy+ccz*uz+cct*ut+cc*u=F(x,y,z,t)\n"); System.out.print("given F(x,y,z,t) \n"); System.out.print(" xmin<=x<=xmax ymin<=y<=ymax Boundaries \n"); System.out.print(" zmin<=z<=zmax tmin<=t<=tmax Boundaries \n"); System.out.print(" boundary and possibly check uana(x,y,z,t) \n"); System.out.print("ccxx="+ccxx+", ccyy="+ccyy+", cczz="+cczz+" \n"); System.out.print("cctt="+cctt+", ccxy="+ccxy+", ccxz="+ccxz+" \n"); System.out.print("ccxt="+ccxt+", ccyz="+ccyz+", ccyt="+ccyt+" \n"); System.out.print("cczt="+cczt+", ccx=" +ccx+ ", ccy=" +ccy+ " \n"); System.out.print("ccz="+ccz+ ", cct=" +cct+ ", 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("tmin="+tmin+", tmax="+tmax+", nt="+nt+" \n"); now = System.currentTimeMillis()/1000.0; prev = now; start = now; hx = (xmax-xmin)/(nx-1); for(int i=0; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.print("ug["+i+","+i2+","+i3+"]="+ ug[S(i,i2,i3,i4,ny,nz,nt)]+ ", Ua="+Ua[S(i,i2,i3,i4,ny,nz,nt)]+", err="+ (ug[S(i,i2,i3,i4,ny,nz,nt)]- Ua[S(i,i2,i3,i4,ny,nz,nt)])+"\n"); } // i4 } // i3 } // i2 } // i System.out.print(" maxerr="+maxerr+", avgerr="+ (avgerr/(nxyzt))+"\n"); now = System.currentTimeMillis()/1000.0; System.out.println("total time "+(now-start)+" seconds"); System.out.print("pde24js_la.js finished\n"); } // end pde24js_la int S(int i, int i2, int i3, int i4, int ny, int nz, int nt) { // zero based index includes boundary, this is row of k[][] return i*(ny*nz*nt)+i2*(nz*nt)+i3*nt+i4; // index into us and ut, RHS } // end S // from uana23_fem.js problem definition double F(double x, double y, double z, double t) // RHS { return 15.0*(x*x+y*y+z*z+t*t+x*y+x*z+x*t+y*z+y*t+z*t)+ 61.0*x + 62.0*y + 63.0*z + 64.0*t + 80.0; } // end f // Analytic solution double uana(double x, double y, double z, double t) { return x*x+y*y+z*z+t*t+x*y+x*z+x*t+y*z+y*t+z*t+1.0; } // end u // needs laphi.js available // for finite element method (not needed if coefficients available) double galk(double x, double y, double z, double t, int i, int i2, int i3, int i4, int j, int j2, int j3, int j4, double ccxx, double ccyy, double cczz, double cctt, double ccxy, double ccxz, double ccxt, double ccyz, double ccyt, double cczt, double ccx, double ccy, double ccz, double cct, double cc, int nx, int ny, int nz, int nt, double xg[], double yg[], double zg[], double tg[]) { // Galerkin k stiffness function for this problem return (ccxx * 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)+ ccyy * 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)+ cczz * 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)+ cctt * 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)+ ccxy * L.phip(x,j ,nx-1,xg)* L.phip(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)+ ccxz * L.phip(x,j ,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phip(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)+ ccxt * L.phip(x,j ,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phip(t,j4,nt-1,tg)+ ccyz * L.phi(x,j ,nx-1,xg)* L.phip(y,j2,ny-1,yg)* L.phip(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)+ ccyt * L.phi(x,j ,nx-1,xg)* L.phip(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phip(t,j4,nt-1,tg)+ cczt * L.phi(x,j ,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phip(z,j3,nz-1,zg)* L.phip(t,j4,nt-1,tg)+ ccx * L.phip(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)+ ccy * L.phi(x,j ,nx-1,xg)* L.phip(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)+ ccz * L.phi(x,j ,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phip(z,j3,nz-1,zg)* L.phi(t,j4,nt-1,tg)+ cct * L.phi(x,j ,nx-1,xg)* L.phi(y,j2,ny-1,yg)* L.phi(z,j3,nz-1,zg)* L.phip(t,j4,nt-1,tg)+ cc * 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(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); } // end galk used by integration double galf(double x, double y, double z, double t, int i, int i2, int i3, int i4, int nx, int ny, int nz, int nt, double xg[], double yg[], double zg[], double tg[]) { // Galerkin f function for this problem return F(x,y,z,t)*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); } // end galf used by integration public static void main (String[] args) // "main" required { new pde24js_la(); // construct and execute } // end main } // end class pde24js_la