/* fem_bihar3d_la.c Galerkin FEM biharmonic 4th order * * solve uxxxx(x,y,z) + uyyyy(x,y,z) + uzzzz(x,y,z) + 2*uxxyy(x,y,z) + * 2*uxxzz(x,y,z) + 2*uyyzz(x,y,z) = f(x,y,z) * * f(x,y,z) := 0.24 , * * in the cube xmin #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 6 #define ny 6 #define nz 6 #define npx 6 #define npy 6 #define npz 6 static double xmin = 0.0; /* problem parameters */ static double xmax = 1.0; static double ymin = 0.0; static double ymax = 1.0; static double zmin = 0.0; static double zmax = 1.0; /* i, j, nx, ii, jj, ny, iii, jjj, xg, yg,zg */ /* needed by galk or galf, available at call */ static int i, j, ii, jj, iii, jjj; static double xg[nx]; /* X grig */ static double yg[ny]; /* Y grid */ static double zg[ny]; /* z grid */ static double hx, hy, hz; static double ug[nx*ny*nz]; /* solution */ static double maxerr; /* function prototypes */ int s(int i, int j, int k); // subscript for kg and Ua double F(double x, double y, double z); /* RHS */ double ub(double x, double y, double z); double galk(double x, double y, double z); /* Galerkin k function for this problem */ double galf(double x, double y, double z); /* Galerkin f function for this problem */ void write_soln(); void check_soln(); int main(int argc, char * argv[]) { int nxyz = nx*ny*nz; double x, y, z; /* npx, npy, npz Gauss Legendre integration order */ double xx[npx]; double wx[npx]; double yy[npy]; double wy[npy]; double zz[npy]; double wz[npy]; double val, err, avgerr; int px, py, pz; double kg[nx*ny*nz][nx*ny*nz]; double fg[nx*ny*nz]; double Ua[nx*ny*nz]; int stat; printf("fem_bihar3d_la.c running.\n"); printf("solve uxxxx(x,y,z) + uyyyy(x,y,z) + uzzzz(x,y,z) + 2*uxxyy(x,y,z) + \n"); printf(" 2*uxxzz(x,y,z) + 2*uyyzz(x,y,z) = f(x,y,z)\n"); printf(" \n"); printf(" f(x,y,z) := 0.24 ,\n"); printf(" \n"); printf(" in the cube xminmaxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%d,%d,%d]=%f, Ua=%f, err=%g \n", i,ii,iii,ug[s(i,ii,iii)],Ua[s(i,ii,iii)], ug[s(i,ii,iii)]-Ua[s(i,ii,iii)]); } } } printf("xmax=%f, ymax=%f, zmax=%f, nx=%d, ny=%d, nz=%d, npx=%d, npy=%d, npz=%d \n", xmax,ymax,zmax,nx,ny,nz,npx,npy,npz); printf(" maxerr=%g, avgerr=%g \n", maxerr,avgerr/(double)(nx*ny*nz)); printf("\n"); printf("calling gnuplot \n"); fflush(stdout); stat = execl("/usr/bin/gnuplot","-persist","fem_bihar3d_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_bihar3d_la main */ int s(int i, int j, int k) // subscript for kg and Ua { return i*ny*nz+ii*nz+iii; } /* PDE problem definition functions f and ub */ double F(double x, double y, double z) { return 0.24; } double ub(double x, double y, double z) { return 0.01*x*x*x*x + 0.02*y*y*y*y + 0.03*z*z*z*z - 0.04*x*x*y*y - 0.05*y*y*z*z - 0.06*x*x*z*z + 0.1*x*x*x*y + 0.2*z*z*z*x - 0.03*y*y*y*z - x*y - y*z - x*z + 1.0; } double galk(double x, double y, double z) { /* Galerkin k stiffness function for this problem */ /* solve uxxxx(x,y,z) + uyyyy(x,y,z) + uzzzz(x,y,z) + */ /* 2*uxxyy(x,y,z) + 2*uxxzz(x,y,z) + 2*uyyzz(x,y,z) = f(x,y,z) */ return (phipppp(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg) + phi(x,j,nx-1,xg)* phipppp(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg) + phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phipppp(z,jjj,nz-1,zg) + 2.0* phipp(x,j,nx-1,xg)* phipp(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg) + 2.0* phipp(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phipp(z,jjj,nz-1,zg) + 2.0* phi(x,j,nx-1,xg)* phipp(y,jj,ny-1,yg)* phipp(z,jjj,nz-1,zg))* phi(x,i,nx-1,xg)* phi(y,ii,ny-1,yg)* phi(z,iii,nz-1,zg); } /* end galk used by integration */ double galf(double x, double y, double z) /* Galerkin f function for this problem */ { return F(x,y,z)*phi(x,i,nx-1,xg)*phi(y,ii,ny-1,yg)*phi(z,iii,nz-1,zg); } /* end galf used by integration */ void write_soln() { FILE * fout; fout = fopen("fem_bihar3d_la_c.dat", "w"); if(fout==NULL) { printf("file fem_bihar3d_la_c.dat can not be opened for writing\n"); return; } printf("writing fem_bihar3d_la_c.dat \n"); for(i=0; i