/* fem_check22_la.c Galerkin FEM * solve uxx(x,y) + 2 uxy(x,y) + 3 uyy(x,y) + * 4 ux(x,y) + 5 uy(x,y) + 6 u(x,y) = c(x,y) * boundary conditions computed using u(x) * analytic solution may be given by u(x) = x^3 + y^3 + xy + 1 * gauss-legendre integration used * solve for Uj numerical approximation U(x_j) of u(x_j) * k * U = f, solve simultaneous equations for U */ #include #include #include #include "laphi.h" #include "simeq.h" #include "gaulegf.h" #undef abs #define abs(x) ((x)<0.0?(-(x)):(x)) #undef min #define min(a,b) ((a)<(b)?(a):(b)) #undef max #define max(a,b) ((a)>(b)?(a):(b)) static double kg[160000]; /* (i*nx+j)*ny*ny + (ii*ny+jj) */ static double xg[400]; static double yg[400]; static double fg[400]; static double ug[400]; static double Ua[400]; static double xmin = 0.0; /* problem parameters */ static double xmax = 1.0; static double ymin = 0.0; static double ymax = 1.0; static int nx = 4; static int ny = 4; double F(double x, double y) /* forcing function, c(x,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) /* analytic solution and boundaries */ { return x*x*x+y*y*y+x*y+1; } /* i, j, nx, ii, jj, ny, needed by galk or galf, available at call */ int i, j, ii, jj; double galk(double x, double y) { /* Galerkin k stiffness function for this problem */ return ( phipp(x,j,nx-1,xg)* phi(y,jj,ny-1,yg) + 2.0 * phip(x,j,nx-1,xg)* phip(y,jj,ny-1,yg) + 3.0 * phi(x,j,nx-1,xg)*phipp(y,jj,ny-1,yg) + 4.0 * phip(x,j,nx-1,xg)* phi(y,jj,ny-1,yg) + 5.0 * phi(x,j,nx-1,xg)* phip(y,jj,ny-1,yg) + 6.0 * phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg) )* phi(x,i,nx-1,xg)* phi(y,ii,ny-1,yg); } /* end galk used by aquad3 and other integration */ double galf(double x, double y) /* Galerkin f function for this problem */ { return F(x,y)*phi(x,i,nx-1,xg)*phi(y,ii,ny-1,yg); } /* end galf used by aquad and other integration */ int main(int argc, char *argv[]) { /* i, j and n above, used by aquad3 */ double x, y, hx, hy; double a, b, sum; double xx[100], wx[100]; /* for Gauss-Legendre */ double yy[100], wy[100]; /* for Gauss-Legendre */ double val, err, avgerr, maxerr; int px, npx, py, npy; printf("fem_check22_la.c running \n"); printf("Given uxx + 2 uxy + 3 uyy + 4 ux + 5 uy + 6 u = \n"); printf("6x^3+6y^3+12x^2+15y^2+6xy+11x+22y+8 \n"); printf("xmin<=x<=xmax ymin<=y<=ymax Boundaries \n"); printf("Analytic solution u(x,y) = x^3 + y^3 +xy + 1 \n"); printf("xmin=%g, xmax=%g, ymin=%g, ymax=%g \n", xmin, xmax, ymin, ymax); printf("nx=%d, ny=%d \n", nx, ny); printf("x grid and analytic solution at ymin \n"); hx = (xmax-xmin)/(double)(nx-1); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%d,%d]=%6.3f, Ua=%6.3f, err=%g \n", i, ii, ug[i*ny+ii], Ua[i*ny+ii], ug[i*ny+ii]-Ua[i*ny+ii]); } } printf(" maxerr=%g, avgerr=%g \n", maxerr, avgerr/(double)(nx*ny)); printf("\n"); return 0; } /* end main */ /* end fem_check22_la.c */