// fem_check22_la.java Galerkin FEM // solve uxx+2*uxy+3*uyy+4*ux+5*uy+6*u=f(x,y // f(x,y) = 6x^3+6y^3+12x^2+15y^2+6xy+11x+22y+8 // Analytic solution u(x,y)=x^3 + y^3 + xy + 1"); // inside 4 by 4 grid, Gauss Legendre integration class fem_check22_la { // i, j, nx, ii, jj, ny, xg, yg needed by galk or galf, available at call final int nx = 4; final int ny = 4; final int nxy = nx*ny; double xg[] = new double[nx]; double yg[] = new double[ny]; int i, j, ii, jj; laphi L = new laphi(); fem_check22_la() { double x, y, hx, hy; final int npx = 6; // Gauss Legendre integration order final int npy = 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 val, err, avgerr, maxerr; int px, py; double xmin = 0.0; // problem parameters double xmax = 1.0; double ymin = 0.0; double ymax = 1.0; double kg[][] = new double[nxy][nxy]; double fg[] = new double[nxy]; double ug[] = new double[nxy]; double Ua[] = new double[nxy]; System.out.println("fem_check22_la.java running "); System.out.println("Given:"); System.out.println("uxx+2*uxy+3*uyy+4*ux+5*uy+6*u=f(x,y)"); System.out.println("f(x,y)=6x^3+6y^3+12x^2+15y^2+6xy+11x+22y+8"); System.out.println("xmin<=x<=xmax ymin<=y<=ymax Boundaries "); System.out.println("Analytic solution u(x,y)=x^3 + y^3 + xy + 1"); System.out.println("xmin="+xmin+", xmax="+xmax+", ymin="+ymin+ ", ymax="+ymax); System.out.println("nx="+nx+", ny="+ny); System.out.println("x grid and analytic solution at ymin "); hx = (xmax-xmin)/(double)(nx-1); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+","+ii+"]="+ug[i*ny+ii]+", Ua="+Ua[i*ny+ii]+ ", err="+(ug[i*ny+ii]-Ua[i*ny+ii])); } } System.out.println(" maxerr="+maxerr+", avgerr="+ avgerr/(double)(nx*ny)); System.out.println(" "); } // end fem_check22_la constructor // PDE problem definition functions double F(double x, double y) { return 6.0*x*x*x+6.0*y*y*y+12.0*x*x+15.0*y*y+6.0*x*y+11.0*x+22.0*y+8.0; } double uana(double x, double y) // u { return x*x*x+y*y*y+x*y+1; } double galk(double x, double y) { // Galerkin k stiffness function for this problem return ( L.phipp(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg) + 2.0 * L.phip(x,j,nx-1,xg)* L.phip(y,jj,ny-1,yg) + 3.0 * L.phi(x,j,nx-1,xg)*L.phipp(y,jj,ny-1,yg) + 4.0 * L.phip(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg) + 5.0 * L.phi(x,j,nx-1,xg)* L.phip(y,jj,ny-1,yg) + 6.0 * L.phi(x,j,nx-1,xg)* L.phi(y,jj,ny-1,yg) )* L.phi(x,i,nx-1,xg)* L.phi(y,ii,ny-1,yg); } // end galk used by integration double galf(double x, double y) // Galerkin f function for this problem { return F(x,y)*L.phi(x,i,nx-1,xg)*L.phi(y,ii,ny-1,yg); } // end galf used by integration public static void main (String[] args) { new fem_check22_la(); } } // end class fem_check22_la