// fem_check47h_la.c Galerkin FEM // Biharmonic 4th order PDE in seven dimensions // solve Uxxxx(x,y,z,t,u,v,w) + Uyyyy(x,y,z,t,u,v,w) + Uzzzz(x,y,z,t,u,v,w) + // Utttt(x,y,z,t,u,v,w) + Uuuuu(x,y,z,t,u,v,w) + Uvvvv(x,y,z,t,u,v,w) + // Uwwww(x,y,z,t,u,v,w) + // 2 Uxx(x,y,z,t,u,v,w) + 2 Uyy(x,y,z,t,u,v,w) + 2 Uzz(x,y,z,t,u,v,w) + // 2 Utt(x,y,z,t,u,v,w) + 2 Uuu(x,y,z,t,u,v,w) + 2 Uvv(x,y,z,t,u,v,w) + // 2 Uww(x,y,z,t,u,v,w) + // 8 U(x,y,z,t,u,v,w) = F(x,y,z,t,u,v,w) // // F(x,y,z,t,u,v,w) = sin(x+y+z+t+u+v+w) // // boundary conditions computed using uana(x,y,z,t,u,v,w) // analytic solution is U(x,y,z,t,u,v,w) = sin(x+y+z+t+u+v+w) // // subscripts in code use x[i], y[i2], z[i3], t[i4], u[i5], v[i6], w[i7] // // using Lagrange Phi functions and Gauss-Legendre integration // solve for U numerical approximation U(x_i,y_i2,z_i3,t_i4,u_i5,v_i6,w_i7) // kg * uu = 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 3 #define ny 3 #define nz 3 #define nt 3 #define nu 3 #define nv 3 #define nw 3 #define nxyztuvw nx*ny*nz*nt*nu*nv*nt int s(int i, int i2, int i3, int i4, int i5, int i6, int i7) { // row index to kg, index to uu and fg return i*ny*nz*nt*nu*nv*nw + i2*nz*nt*nu*nv*nw + i3*nt*nu*nv*nw + i4*nu*nv*nw + i5*nv*nw + i6*nw + i7; } // end s int ss(int i, int i2, int i3, int i4, int i5, int i6, int i7, int j, int j2, int j3, int j4, int j5, int j6, int j7) { // row,column index into kg return s(i,i2,i3,i4,i5,i6,i7)*nxyztuvw + s(j,j2,j3,j4,j5,j6,j7); } // end ss static double kg[nxyztuvw*nxyztuvw]; static double xg[nx]; static double yg[ny]; static double zg[nz]; static double tg[nt]; static double ug[nu]; static double vg[nv]; static double wg[nw]; static double fg[nxyztuvw]; static double uu[nxyztuvw]; static double Ua[nxyztuvw]; static double xmin = 0.0; // problem parameters static double xmax = 0.5; static double ymin = 0.0; static double ymax = 0.5; static double zmin = 0.0; static double zmax = 0.5; static double tmin = 0.0; static double tmax = 0.5; static double umin = 0.0; static double umax = 0.5; static double vmin = 0.0; static double vmax = 0.5; static double wmin = 0.0; static double wmax = 0.5; static double F(double x, double y, double z, double t, double u, double v, double w) // forcing function, F(x,y,z,t,u,v,w) { return sin(x+y+z+t+u+v+w); } // end F static double uana(double x, double y, double z, double t, double u, double v, double w) //analytic solution and boundaries { return sin(x+y+z+t+u+v+w); } // i,...i7, j, ...j7, needed by galk and galf, available at call static int i, j, i2, j2, i3, j3, i4, j4, i5, j5, i6, j6, i7, j7; static double galk(double x, double y, double z, double t, double u, double v, double w) { // Galerkin k stiffness function for this problem return ( phipppp(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ phi(x,j,nx-1,xg)* phipppp(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ phi(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phipppp(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ phi(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phipppp(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ phi(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phipppp(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ phi(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phipppp(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ phi(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phipppp(w,j7,nw-1,wg)+ 2.0*phipp(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ 2.0*phi(x,j,nx-1,xg)* phipp(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ 2.0*phi(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phipp(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ 2.0*phi(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phipp(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ 2.0*phi(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phipp(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ 2.0*phi(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phipp(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg)+ 2.0*phi(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phipppp(w,j7,nw-1,wg)+ 8.0*phi(x,j,nx-1,xg)* phi(y,j2,ny-1,yg)* phi(z,j3,nz-1,zg)* phi(t,j4,nt-1,tg)* phi(u,j5,nu-1,ug)* phi(v,j6,nv-1,vg)* phi(w,j7,nw-1,wg) )* (phi(x,i,nx-1,xg)* phi(y,i2,ny-1,yg)* phi(z,i3,nz-1,zg)* phi(t,i4,nt-1,tg)* phi(u,i5,nu-1,ug)* phi(v,i6,nv-1,vg)* phi(w,i7,nw-1,wg) ); } // end galk used by integration static double galf(double x, double y, double z, double t, double u, double v, double w) // Galerkin f function for this problem { return F(x,y,z,t,u,v,w)* phi(x,i ,nx-1,xg)*phi(y,i2,ny-1,yg)*phi(z,i3,nz-1,zg)* phi(t,i4,nt-1,tg)*phi(u,i5,nu-1,ug)*phi(v,i6,nv-1,vg)* phi(w,i7,nw-1,wg); } // end galf used by integration int main(int argc, char *argv[]) { double x, y, z, t, u, v, w, hx, hy, hz, ht, hu, hv, hw; double xx[100], wx[100]; // for Gauss-Legendre coord,weight double yy[100], wy[100]; double zz[100], wz[100]; double tt[100], wt[100]; double uuu[100], wu[100]; // name conflict double vv[100], wv[100]; double www[100], ww[100]; // name conflict double tmp, val, err, avgerr, maxerr; int px, npx, py, npy, pz, npz, pt, npt, pu, npu, pv, npv, pw, npw; double time_start; double time_now; double time_last; printf("fem_check47h_la.c running \n"); printf("Given Uxxxx(x,y,z,t,u,v,w) + Uyyyy(x,y,z,t,u,v,w) + Uzzzz(x,y,z,t,u,v,w) + \n"); printf(" Utttt(x,y,z,t,u,v,w) + Uuuuu(x,y,z,t,u,v,w) + Uvvvv(x,y,z,t,u,v,w) + \n"); printf(" Uwwww(x,y,z,t,u,v,w) + \n"); printf(" 2 Uxx(x,y,z,t,u,v,w) + 2 Uyy(x,y,z,t,u,v,w) + 2 Uzz(x,y,z,t,u,v,w) + \n"); printf(" 2 Utt(x,y,z,t,u,v,w) + 2 Uuu(x,y,z,t,u,v,w) + 2 Uvv(x,y,z,t,u,v,w) + \n"); printf(" 2 Uww(x,y,z,t,u,v,w) + \n"); printf(" 8 U(x,y,z,t,u,v,w) = F(x,y,z,t,u,v,w) \n"); printf(" F(x,y,z,t,u,v,w) = sin(x+y+z+t+u+v+w) \n"); printf(" \n"); printf("Biharmonic 4th order PDE in seven dimensions \n"); printf("Solve by Galerkin Finite Element Method \n"); printf(" using Lagrange Phi functions and Gauss-Legendre integration \n"); printf("\n"); printf("xmin<=x<=xmax ymin<=y<=ymax zmin<=z<=zmax Boundaries \n"); printf("tmin<=t<=tmax umin<=u<=umax vmin<=v<=vmax Boundaries \n"); printf("wmin<=w<=wmax Boundaries \n"); printf("Analytic solution U(x,y,z,t,u,v,w) = sin(x+y+z+t+u+v+w) \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("umin=%g, umax=%g, vmin=%g, vmax=%g \n", umin, umax, vmin, vmax); printf("wmin=%g, wmax=%g \n", wmin, wmax); printf("nx=%d, ny=%d, nz=%d, nt=%d \n", nx, ny, nz, nt); printf("nu=%d, nv=%d, nw=%d \n", nu, nv, nw); 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,umin,vmin,wmin \n"); hx = (xmax-xmin)/(double)(nx-1); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("uu[%1d,%1d,%1d,%1d,%1d,%1d,%1d]=%8.3f, Ua=%8.3f, err=%g \n", i, i2, i3, i4, i5, i6, i7, uu[s(i,i2,i3,i4,i5,i6,i7)], Ua[s(i,i2,i3,i4,i5,i6,i7)], err); } // i7 } // i6 } // i5 } // i4 } // i3 } // i2 } // i time_now = (double)clock()/(double)CLOCKS_PER_SEC; printf("total CPU time = %f seconds \n", time_now-time_start); time_last = time_now; printf("\n"); printf(" maxerr=%g, avgerr=%g \n", maxerr, avgerr/(double)(nxyztuvw)); printf("\n "); printf("end fem_check47h_la.c \n"); return 0; } // end main // end fem_check47h_la.c