/* fem_bihar2d_la.c Galerkin FEM biharmonic 4th order * * solve uxxxx(x,y) + 2*uxxyy(x,y) + uyyyy(x,y) + * 2*uxx(x,y) + 2*uyy(x,y) + 2*u(x,y) = f(x,y) * * f(x,y) := 2.4 + 0.08*x*x + 0.32*y*y + 1.6*x*y + 0.02*x*x*x*x + * 0.04*y*y*y*y - 0.08*x*x*y*y + 0.2*x*x*x*y + 0.4*y*y*y*x * * in the rectangle xmin< x #include #include #include #include "simeq.h" #include "laphi.h" #undef abs #define abs(a) ((a)<0.0?(-(a)):(a)) #undef max #define max(a,b) ((a)>(b)?(a):(b)) #define nx 9 #define ny 9 #define npx 9 #define npy 9 static double xmin = 0.0; /* problem parameters */ static double xmax = 2.0; static double ymin = 0.0; static double ymax = 2.0; /* i, j, nx, ii, jj, ny, xg, yg needed by galk or galf, available at call*/ static int i, j, ii, jj; static double xg[nx]; /* X grig */ static double yg[ny]; /* Y grid */ static double hx, hy; static double ug[nx*ny]; /* solution */ static double maxerr; /* function prototypes */ double F(double x, double y); /* RHS */ double ub(double x, double y); double galk(double x, double y); /* Galerkin k function for this problem */ double galf(double x, double y); /* Galerkin f function for this problem */ void write_soln(); void check_soln(); int main(int argc, char * argv[]) { int nxy = nx*ny; double x, y; /* npx, npy Gauss Legendre integration order */ double xx[npx]; double wx[npx]; double yy[npy]; double wy[npy]; double val, err, avgerr; int px, py; double kg[nx*ny][nx*ny]; double fg[nx*ny]; double Ua[nx*ny]; int stat; printf("fem_bihar2d_la.c running.\n"); printf("solve uxxxx(x,y) + 2*uxxyy(x,y) + uyyyy(x,y) + \n"); printf(" 2*uxx(x,y) + 2*uyy(x,y) + 2*u(x,y) = f(x,y)\n"); printf(" \n"); printf("f(x,y) := 2.4 + 0.08*x*x + 0.32*y*y + 1.6*x*y + 0.02*x*x*x*x +\n"); printf(" 0.04*y*y*y*y - 0.08*x*x*y*y + 0.2*x*x*x*y + 0.4*y*y*y*x\n"); printf(" \n"); printf("in the rectangle xmin< x maxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%d,%d]=%f, Ua=%f, err=%g \n", i,ii,ug[i*ny+ii],Ua[i*ny+ii],ug[i*ny+ii]-Ua[i*ny+ii]); } } printf("xmax=%f, ymax=%f, nx=%d, ny=%d, npx=%d, npy=%d \n", xmax,ymax,nx,ny,npx,npy); printf(" maxerr=%g, avgerr=%g \n", maxerr,avgerr/(double)(nx*ny)); printf("\n"); printf("calling gnuplot \n"); fflush(stdout); stat = execl("/usr/bin/gnuplot","-persist","fem_bihar2d_la_c.plot", NULL); /* only returns upon error, no return on sucess */ printf("returned from gnuplot with stat= %d \n", stat); return 0; } /* end fem_bihar2d_la main */ /* PDE problem definition functions f and ub */ double F(double x, double y) { return 2.4 + 0.08*x*x + 0.32*y*y + 1.6*x*y + 0.02*x*x*x*x + 0.04*y*y*y*y - 0.08*x*x*y*y + 0.2*x*x*x*y + 0.4*y*y*y*x; } double ub(double x, double y) { return 0.01*x*x*x*x + 0.02*y*y*y*y - 0.04*x*x*y*y + 0.1*x*x*x*y + 0.2*y*y*y*x - x*y + 1.0; } double galk(double x, double y) { /* Galerkin k stiffness function for this problem */ /* solve uxxxx(x,y) + 2*uxxyy(x,y) + uyyyy(x,y) + */ /* 2*uxx(x,y) + 2*uyy(x,y) + 2*u(x,y) = f(x,y) */ return ( phipppp(x,j,nx-1,xg)* phi(y,jj,ny-1,yg) + 2.0* phipp(x,j,nx-1,xg)* phipp(y,jj,ny-1,yg) + phi(x,j,nx-1,xg)* phipppp(y,jj,ny-1,yg) + 2.0* phipp(x,j,nx-1,xg)* phi(y,jj,ny-1,yg) + 2.0* phi(x,j,nx-1,xg)* phipp(y,jj,ny-1,yg) + 2.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 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 integration */ void write_soln() { FILE * fout; fout = fopen("fem_bihar2d_la_c.dat", "w"); if(fout==NULL) { printf("file fem_bihar2d_la_c.dat can not be opened for writing\n"); return; } printf("writing fem_bihar2d_la_c.dat \n"); for(i=0; i