/* fem_check33_la.c Galerkin FEM * solve uxxx(x,y,z) + 2 uyyy(x,y,z) + 3 uzzz(x,y,z) + * 4 uxxy(x,y,z) + 5 uxxz(x,y,z) + 6 uyyx(x,y,z) + * 7 uyyz(x,y,z) + 8 uzzx(x,y,z) + 9 uzzy(x,y,z) + * 10 uxx(x,y,z) + 11 uyy(x,y,z) + 12 uzz(x,y,z) + * 13 uxy(x,y,z) + 14 uxz(x,y,z) + 15 uyz(x,y,z) + * 16 ux(x,y,z) + 17 uy(x,y,z) + 18 uz(x,y,z) + * 19 u(x,y,z) = F(x,y,z) * F(x,y,z) = * 406.0 + 208.0*x*y*z*z + 240.0*x*x*y*z + 88.0*x*x*z*z + * 136.0*x*x*y*z*z + 128.0*x*y*y*z*z + 217.0*x + 302.0*y + * 80.0*y*y*z*z + 144.0*x*x*y*y*z + 96.0*x*x*y*y + * 224.0*x*y*y*z + 76.0*x*x*y*y*z*z + 144.0*x*x*y + * 80.0*y*y*z + 64.0*y*z*z + 133.0*y*z + 128.0*x*y*y + * 112.0*x*x*z + 96.0*x*z*z + 114.0*x*z + 95.0*x*y + 431.0*z + * 19.0*x*x*x*x + 38.0*y*y*y*y + 57.0*z*z*z*z + 64.0*x*x*x + * 136.0*y*y*y + 216.0*z*z*z + 120.0*x*x + 264.0*y*y + 432.0*z*z; * * boundary conditions computed using u(x,y,z) * analytic solution may be given by u(x,y,z) = x^4 + 2 y^4 + 3 z^4 + * 4 x^2 y^2 z^2 + 5 x y + 6 x z + 7 y z + 8 * gauss-legendre integration used * solve for Uijk numerical approximation U(x_i,y_j,z_k) of u(x_i,y_j,z_k) * kg * ug = fg, solve simultaneous equations for U */ #include #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)) #define nx 5 #define ny 5 #define nz 5 int s(int i, int ii, int iii) { return i*ny*nz+ii*nz+iii; } /* end s */ int ss(int i, int ii, int iii, int j, int jj, int jjj) { return (i*ny*nz+ii*nz+iii)*nx*ny*nz+(j*ny*nz+jj*nz+jjj); } /* end ss */ static double kg[nx*ny*nz*nx*ny*nz]; /* (i*ny*nz+ii*nz+iii)*ny*ny*nz + (j*ny*nz+jj*nz+jjj) */ static double xg[nx]; static double yg[ny]; static double zg[nz]; static double fg[nx*ny*nz]; static double ug[nx*ny*nz]; static double Ua[nx*ny*nz]; 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; static double F(double x, double y, double z) /* forcing function, F(x,y,z) */ { return 406.0 + 208.0*x*y*z*z + 240.0*x*x*y*z + 88.0*x*x*z*z + 136.0*x*x*y*z*z + 128.0*x*y*y*z*z + 217.0*x + 302.0*y + 80.0*y*y*z*z + 144.0*x*x*y*y*z + 96.0*x*x*y*y + 224.0*x*y*y*z + 76.0*x*x*y*y*z*z + 144.0*x*x*y + 80.0*y*y*z + 64.0*y*z*z + 133.0*y*z + 128.0*x*y*y + 112.0*x*x*z + 96.0*x*z*z + 114.0*x*z + 95.0*x*y + 431.0*z + 19.0*x*x*x*x + 38.0*y*y*y*y + 57.0*z*z*z*z + 64.0*x*x*x + 136.0*y*y*y + 216.0*z*z*z + 120.0*x*x + 264.0*y*y + 432.0*z*z; } static double uana(double x, double y, double z) /*analytic solution and boundaries*/ { return x*x*x*x + 2.0*y*y*y*y + 3.0*z*z*z*z + 4.0*x*x*y*y*z*z + 5.0*x*y + 6.0*x*z + 7.0*y*z + 8.0; } /* i, j, nx, ii, jj, ny, iii, jjj, nz needed by galk or galf,available call*/ static int i, j, ii, jj, iii, jjj; static double galk(double x, double y, double z) { /* Galerkin k stiffness function for this problem */ return (1.0*phippp(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg) + 2.0* phi(x,j,nx-1,xg)*phippp(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg) + 3.0* phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phippp(z,jjj,nz-1,zg) + 4.0* phipp(x,j,nx-1,xg)* phip(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg) + 5.0* phipp(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phip(z,jjj,nz-1,zg) + 6.0* phip(x,j,nx-1,xg)* phipp(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)+ 7.0* phi(x,j,nx-1,xg)* phipp(y,jj,ny-1,yg)* phip(z,jjj,nz-1,zg)+ 8.0* phip(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phipp(z,jjj,nz-1,zg)+ 9.0* phi(x,j,nx-1,xg)* phip(y,jj,ny-1,yg)* phipp(z,jjj,nz-1,zg)+ 10.0* phipp(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)+ 11.0* phi(x,j,nx-1,xg)* phipp(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)+ 12.0* phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phipp(z,jjj,nz-1,zg)+ 13.0* phip(x,j,nx-1,xg)* phip(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)+ 14.0* phip(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phip(z,jjj,nz-1,zg)+ 15.0* phi(x,j,nx-1,xg)* phip(y,jj,ny-1,yg)* phip(z,jjj,nz-1,zg)+ 16.0* phip(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)+ 17.0* phi(x,j,nx-1,xg)* phip(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)+ 18.0* phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phip(z,jjj,nz-1,zg)+ 19.0* phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phi(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 */ static 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 */ int main(int argc, char *argv[]) { double x, y, z, hx, hy, hz; double xx[100], wx[100]; /* for Gauss-Legendre */ double yy[100], wy[100]; /* for Gauss-Legendre */ double zz[100], wz[100]; /* for Gauss-Legendre */ double val, err, avgerr, maxerr; int px, npx, py, npy, pz, npz; double time_start, time_now, time_last; printf("fem_check33_la.c running \n"); printf("Given uxxx(x,y,z) + 2 uyyy(x,y,z) + 3 uzzz(x,y,z) + \n"); printf(" 4 uxxy(x,y,z) + 5 uxxz(x,y,z) + 6 uyyx(x,y,z) + \n"); printf(" 7 uyyz(x,y,z) + 8 uzzx(x,y,z) + 9 uzzy(x,y,z) + \n"); printf(" 10 uxx(x,y,z) + 11 uyy(x,y,z) + 12 uzz(x,y,z) + \n"); printf(" 13 uxy(x,y,z) + 14 uxz(x,y,z) + 15 uyz(x,y,z) + \n"); printf(" 16 ux(x,y,z) + 17 uy(x,y,z) + 18 uz(x,y,z) + \n"); printf(" 19 u(x,y,z) = F(x,y,z) \n"); printf(" F(x,y,z) = \n"); printf(" 406.0 + 208.0*x*y*z*z + 240.0*x*x*y*z + 88.0*x*x*z*z + \n"); printf(" 136.0*x*x*y*z*z + 128.0*x*y*y*z*z + 217.0*x + 302.0*y + \n"); printf(" 80.0*y*y*z*z + 144.0*x*x*y*y*z + 96.0*x*x*y*y + \n"); printf(" 224.0*x*y*y*z + 76.0*x*x*y*y*z*z + 144.0*x*x*y + \n"); printf(" 80.0*y*y*z + 64.0*y*z*z + 133.0*y*z + 128.0*x*y*y + \n"); printf(" 112.0*x*x*z + 96.0*x*z*z + 114.0*x*z + 95.0*x*y + 431.0*z + \n"); printf(" 19.0*x*x*x*x + 38.0*y*y*y*y + 57.0*z*z*z*z + 64.0*x*x*x + \n"); printf(" 136.0*y*y*y + 216.0*z*z*z + 120.0*x*x + 264.0*y*y + 432.0*z*z \n"); printf("xmin<=x<=xmax ymin<=y<=ymax zmin<=z<=zmax Boundaries \n"); printf("Analytic solution u(x,y,z) = x^4 + 2 y^4 + 3 z^4 + \n"); printf(" 4 x^2 y^2 z^2 + 5 x y + 6 x z + 7 y z + 8 \n"); printf("\n"); printf("xmin=%g, xmax=%g, ymin=%g, ymax=%g, zmin=%g, zmax=%g \n", xmin, xmax, ymin, ymax, zmin, zmax); printf("nx=%d, ny=%d, nz=%d \n", nx, ny, nz); time_start = (double)clock()/(double)CLOCKS_PER_SEC; printf("time start = %f seconds \n", time_start); time_last = time_start; printf("x grid and analytic solution at ymin,zmin \n"); hx = (xmax-xmin)/(double)(nx-1); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%d,%d,%d]=%8.3f, Ua=%8.3f, err=%g \n", i, ii, iii, ug[s(i,ii,iii)], Ua[s(i,ii,iii)], err); } } } time_now = (double)clock()/(double)CLOCKS_PER_SEC; printf("total CPU time = %f seconds \n", time_now-time_start); printf("\n"); printf(" maxerr=%g, avgerr=%g \n", maxerr, avgerr/(double)(nx*ny*nz)); printf("\n"); printf("end fem_check33_la.c \n"); return 0; } /* end main */ /* end fem_check33_la.c */