/* fem_check44_la.c Galerkin FEM * solve uxxxx(x,y,z,t) + 2 uyyyy(x,y,z,t) + 3 uzzzz(x,y,z,t) + * 4 utttt(x,y,z,t) + 5 uxyt(x,y,z,t) + 6 uyyzz(x,y,z,t) + * 7 uztt(x,y,z,t) + 8 uxxx(x,y,z,t) + 9 uyyt(x,y,z,t) + * 10 uzt(x,y,z,t) + 11 ut(x,y,z,t) + 12 u(x,y,z,t) = * F(x,y,z,t) * F(x,y,z,t) = 706 + 120 t^2 + 140 y^2z + 768 x + * 180 z^2*t + 200 y^2z*t + 44 t^3 + * 110 y^2z^2t + 66 xy + 12t^4 + * 24 z^4 + 36 y^4 + 48 x^4 + * 60 y^2z^2t^2 + 72 xyt + 84 xz + 96 t * * boundary conditions computed using u(x,y,z,t) * analytic solution is u(x,y,z,t) = t^4 + 2 z^4 + 3 y^4 + 4 x^4 + * 5 y^2 z^2 t^2 + 6 x y t + * 7 x z + 8 t + 9 * gauss-legendre integration used * solve for Uijkl numerical approximation U(x_i,y_j,z_k,t_l) * 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 #define nt 5 int s(int i, int ii, int iii, int iiii) { return i*ny*nz*nt+ii*nz*nt+iii*nt+iiii; } /* end s */ int ss(int i, int ii, int iii, int iiii, int j, int jj, int jjj, int jjjj) { return (i*ny*nz*nt+ii*nz*nt+iii*nt+iiii)*nx*ny*nz*nt+ (j*ny*nz*nt+jj*nz*nt+jjj*nt+jjjj); } /* end ss */ static double kg[nx*ny*nz*nt*nx*ny*nz*nt]; /* (i*ny*nz*nt+ii*nz*nt+iii*nt+iiii)*ny*ny*nz*nt+ (j*ny*nz*nt+jj*nz*nt+jjj*nt+jjjj) */ static double xg[nx]; static double yg[ny]; static double zg[nz]; static double tg[nt]; static double fg[nx*ny*nz*nt]; static double ug[nx*ny*nz*nt]; static double Ua[nx*ny*nz*nt]; 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 tmin = 0.0; static double tmax = 1.0; static double F(double x, double y, double z, double t) /* forcing function, F(x,y,z,t) */ { return 706.0 + 120.0*t*t + 140.0*y*y*z + 768.0*x + 180.0*z*z*t + 200.0*y*y*z*t + 44.0*t*t*t + 110.0*y*y*z*z*t + 66.0*x*y + 12.0*t*t*t*t + 24.0*z*z*z*z + 36.0*y*y*y*y + 48.0*x*x*x*x + 60.0*y*y*z*z*t*t + 72.0*x*y*t + 84.0*x*z + 96.0*t; } static double uana(double x, double y, double z, double t) /*analytic solution and boundaries*/ { return t*t*t*t + 2.0*z*z*z*z + 3.0*y*y*y*y + 4.0*x*x*x*x + 5.0*y*y*z*z*t*t + 6.0*x*y*t + 7.0*x*z + 8.0*t + 9.0; } /* i, j, ... , jjjj, needed by galk or galf,available call*/ static int i, j, ii, jj, iii, jjj, iiii, jjjj; static double galk(double x, double y, double z, double t) { /* Galerkin k stiffness function for this problem */ return ( phipppp(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)* phi(t,jjjj,nt-1,tg)+ 2.0* phi(x,j,nx-1,xg)*phipppp(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)* phi(t,jjjj,nt-1,tg)+ 3.0* phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)*phipppp(z,jjj,nz-1,zg)* phi(t,jjjj,nt-1,tg)+ 4.0* phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)* phipppp(t,jjjj,nt-1,tg)+ 5.0* phip(x,j,nx-1,xg)* phip(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)* phip(t,jjjj,nt-1,tg)+ 6.0* phi(x,j,nx-1,xg)* phipp(y,jj,ny-1,yg)* phipp(z,jjj,nz-1,zg)* phi(t,jjjj,nt-1,tg)+ 7.0* phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phip(z,jjj,nz-1,zg)* phipp(t,jjjj,nt-1,tg)+ 8.0* phippp(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)* phi(t,jjjj,nt-1,tg)+ 9.0* phi(x,j,nx-1,xg)* phipp(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)* phip(t,jjjj,nt-1,tg)+ 10.0* phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phip(z,jjj,nz-1,zg)* phip(t,jjjj,nt-1,tg)+ 11.0* phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)* phip(t,jjjj,nt-1,tg)+ 12.0* phi(x,j,nx-1,xg)* phi(y,jj,ny-1,yg)* phi(z,jjj,nz-1,zg)* phi(t,jjjj,nt-1,tg))* (phi(x,i,nx-1,xg)* phi(y,ii,ny-1,yg)* phi(z,iii,nz-1,zg)* phi(t,iiii,nt-1,tg)); } /* end galk used by integration */ static double galf(double x, double y, double z, double t) /* Galerkin f function for this problem */ { return F(x,y,z,t)*phi(x,i,nx-1,xg)*phi(y,ii,ny-1,yg)*phi(z,iii,nz-1,zg)* phi(t,iiii,nt-1,tg); } /* end galf used by integration */ int main(int argc, char *argv[]) { double x, y, z, t, hx, hy, hz, ht; double xx[100], wx[100]; /* for Gauss-Legendre */ double yy[100], wy[100]; double zz[100], wz[100]; double tt[100], wt[100]; double val, err, avgerr, maxerr; int px, npx, py, npy, pz, npz, pt, npt; double time_start; double time_now; double time_last; printf("fem_check44_la.c running \n"); printf("Given uxxxx(x,y,z,t) + 2 uyyyy(x,y,z,t) + 3 uzzzz(x,y,z,t) + \n"); printf(" 4 utttt(x,y,z,t) + 5 uxyt(x,y,z,t) + 6 uyyzz(x,y,z,t) + \n"); printf(" 7 uztt(x,y,z,t) + 8 uxxx(x,y,z,t) + 9 uyyt(x,y,z,t) + \n"); printf(" 10 uzt(x,y,z,t) + 11 ut(x,y,z,t) + 12 u(x,y,z,t) = \n"); printf(" F(x,y,z,t) \n"); printf(" F(x,y,z,t) = 706 + 120 t^2 + 140 y^2z + 768 x + \n"); printf(" 180 z^2*t + 200 y^2z*t + 44 t^3 + \n"); printf(" 110 y^2z^2t + 66 xy + 12t^4 + \n"); printf(" 24 z^4 + 36 y^4 + 48 x^4 + \n"); printf(" 60 y^2z^2t^2 + 72 xyt + 84 xz + 96 t \n"); printf("xmin<=x<=xmax ymin<=y<=ymax zmin<=z<=zmax Boundaries \n"); printf("Analytic solution u(x,y,z,t) = t^4 + 2 z^4 + 3 y^4 + \n"); printf(" 4 x^4 + 5 y^2 z^2 t^2 + 6 x y t + 7 x z + 8 t + 9 \n"); printf("\n"); printf("xmin=%g, xmax=%g, ymin=%g, ymax=%g \n", xmin, xmax, ymin, ymax); printf("zmin=%g, zmax=%g, tmin=%g, tmax=%g \n", zmin, zmax, tmin, tmax); printf("nx=%d, ny=%d, nz=%d, nt=%d \n", nx, ny, nz, nt); 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,tmin \n"); hx = (xmax-xmin)/(double)(nx-1); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%d,%d,%d,%d]=%8.3f, Ua=%8.3f, err=%g \n", i, ii, iii, iiii, ug[s(i,ii,iii,iiii)], Ua[s(i,ii,iii,iiii)], err); } /* iiii */ } /* iii */ } /* ii */ } /* i */ 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*nt)); printf("\n"); printf("end fem_check44_la.c \n"); return 0; } /* end main */ /* end fem_check44_la.c */