// fem_nl12_la.java Galerkin FEM // solve D*ux(x) + E(x)*(-ux(x)/u(x)^2 - F*uxx(x) = f(x) // f(x) = -2 // D = 1 // F = 1 // E(x) = (x^2+1)^2 // Analytic solution u(x)=x^2+1 // inside grid, Gauss Legendre integration // uses simeq.java // uses nderiv.java // uses laphi.java // uses gaulegf.java import java.text.*; class fem_nl12_la { // i, j, nx, xg needed by galk or galf, available at call final int nx = 10; double xg[] = new double[nx]; double hx; int i, j; laphi L = new laphi(); nderiv RD = new nderiv(); double D = 1.0; double F = 1.0; DecimalFormat f8 = new DecimalFormat(" 0.000"); fem_nl12_la() { double x; final int npx = 96; // Gauss Legendre integration order double xx[] = new double[npx+1]; double wx[] = new double[npx+1]; // for Gauss-Legendre double val, err, avgerr, maxerr; int px; double xmin = 1.0; // problem parameters double xmax = 2.0; double kg[][] = new double[nx][nx]; double fg[] = new double[nx]; double ug[] = new double[nx]; double Ua[] = new double[nx]; System.out.println("fem_nl12_la.java running "); System.out.println("Given:"); System.out.println("D*ux(x)+E(x)*(d/dx 1/u(x)-F*uxx(x)=f(x)"); System.out.println("D*ux(x)-E(x)*(ux(x)/u(x)^2)-F*uxx(x)=f(x)"); System.out.println("f(x)=-2"); System.out.println("D=1, F=1, E(x)=(x^2+1)^2"); System.out.println("xmin<=x<=xmax Boundaries "); System.out.println("Analytic solution u(x)=x^2 + 1"); System.out.println("xmin="+xmin+", xmax="+xmax); System.out.println("nx="+nx); System.out.println("x grid and analytic solution "); hx = (xmax-xmin)/(double)(nx-1); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+"]="+ug[i]+", Ua="+Ua[i]+ ", err="+(ug[i]-Ua[i])); } System.out.println(" maxerr="+maxerr+", avgerr="+ avgerr/(double)(nx)); System.out.println(" "); } // end fem_nl12_la constructor // PDE problem definition functions double f(double x) // RHS { return -2.0; } double uana(double x) // u { return x*x+1.0; } double E(double x) { return (x*x+1.0)*(x*x+1.0); } double galk(double x) { // Galerkin k stiffness function for this problem return (D*L.phip(x,j,nx-1,xg) -E(x)*L.phip(x,j,nx-1,xg)/(L.phi(x,j,nx-1,xg)*L.phi(x,j,nx-1,xg)) -F*L.phipp(x,j,nx-1,xg)) *L.phi(x,i,nx-1,xg); } // end galk used by integration double galf(double x) // Galerkin f function for this problem { return f(x)*L.phi(x,i,nx-1,xg); } // end galf used by integration void check_soln(double U[]) { // check D*ux(x) + E(x)*(-ux(x)/u(x)^2) - F*uxx(x) = f(x) double maxerr, err, sumerr, sumsqerr, rmserr, avgerr; double cx[] = new double[nx]; double cxx[] = new double[nx]; double eval_deriv, x; int cnt; sumerr = 0.0; sumsqerr = 0.0; cnt = 0; maxerr = 0.0; for(int i=1; i