// fem_laplace_la.java Galerkin FEM // solve uxx+uyy=0 // Analytic solution u(x,y)=exp(x)*sin(y) // inside 6 by 6 grid, Gauss Legendre integration import java.io.*; class fem_laplace_la { // i, j, nx, ii, jj, ny, xg, yg needed by galk or galf, available at call int i, j, ii, jj, nx, ny; double xg[]; // X grig double yg[]; // Y grid double hx, hy; laphi L = new laphi(); double ug[]; // solution fem_laplace_la(double xmax, double ymax, int anx, int any, int npx, int npy) { nx = anx; ny = any; int nxy = nx*ny; xg = new double[nx]; yg = new double[ny]; double x, y; // npx, npy Gauss Legendre integration order 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 ymin = 0.0; double kg[][] = new double[nxy][nxy]; double fg[] = new double[nxy]; ug = new double[nxy]; double Ua[] = new double[nxy]; System.out.println("fem_laplace_la.java running "); System.out.println("Given:"); System.out.println("uxx+uyy=0"); System.out.println("xmin<=x<=xmax ymin<=y<=ymax Boundaries "); System.out.println("Analytic solution u(x,y)=exp(x)*sim(y)"); 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("xmax="+xmax+", ymax="+ymax+", nx="+nx+ ", ny="+ny+", npx="+npx+", npy="+npy); System.out.println(" maxerr="+maxerr+", avgerr="+ avgerr/(double)(nx*ny)); System.out.println("\n"); } // end fem_laplace_la constructor // PDE problem definition functions double F(double x, double y) { return 0.0; } double uana(double x, double y) // u { return Math.exp(x)*Math.sin(y); } 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) + L.phi(x,j,nx-1,xg)* L.phipp(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 void write_soln() { try { FileWriter fout = new FileWriter("fem_laplace_la.dat"); BufferedWriter fileout = new BufferedWriter(fout); System.out.println("writing fem_laplace_la.dat"); for(int i=0; i