/* pde47h_nu.c homogeneous Biharmonic PDE in six 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) * * boundary conditions computed using Ub(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[ii], z[iii], t[iiii], u[iiiii], * v[iiiiii], w[iiiiiii] */ #include #include #include #include #include #include "deriv.h" #include "simeq.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 /* 6 makes 4^7 = 2^14 = 16384 eqn in 16384 unk */ #define ny 5 #define nz 5 #define nt 5 #define nu 5 #define nv 5 #define nw 5 #define nxyztuvw (nx-2)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2) int s(int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int iiiiiii) /* for x,y,z,t,u,v,w */ { int k; k = (i-1)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2) + (ii-1)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2) + (iii-1)*(nt-2)*(nu-2)*(nv-2)*(nw-2) + (iiii-1)*(nu-2)*(nv-2)*(nw-2) + (iiiii-1)*(nv-2)*(nw-2) + (iiiiii-1)*(nw-2) + (iiiiiii-1); if(k<0 || k>=nxyztuvw) printf("bad s(%d %d %d %d %d %d %d\n", i,ii,iii,iiii,iiiii,iiiiii,iiiiiii); return k; } /* end s */ int sk(int k, int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int iiiiiii) /* for x,y,z,t,u,v,w */ { return k*(nxyztuvw+1) + (i-1)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2) + (ii-1)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2) + (iii-1)*(nt-2)*(nu-2)*(nv-2)*(nw-2) + (iiii-1)*(nu-2)*(nv-2)*(nw-2) + (iiiii-1)*(nv-2)*(nw-2) + (iiiiii-1)*(nw-2) + (iiiiiii-1); } /* end sk */ int ss(int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int iiiiiii, int j, int jj, int jjj, int jjjj, int jjjjj, int jjjjjj, int jjjjjjj) { return s(i,ii,iii,iiii,iiiii,iiiiii,iiiiiii)*(nxyztuvw+1) + s(j,jj,jjj,jjjj,jjjjj,jjjjjj,jjjjjjj); } /* end ss */ static double A[nxyztuvw*(nxyztuvw+1)]; /* last column is RHS */ static double U[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 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 hx, hy, hz, ht, hu, hv, hw; static double Ub(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); } static double f(double x, double y, double z, double t, double u, double v, double w) /* RHS */ { return sin(x+y+z+t+u+v+w); } double eval_derivative(int xord, int yord, int zord, int tord, int uord, int vord, int word, int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int iiiiiii, double U[]) { int j, jj, jjj, jjjj, jjjjj, jjjjjj, jjjjjjj; double cx[nx]; double cy[ny]; double cz[nz]; double ct[nt]; double cu[nu]; double cv[nv]; double cw[nw]; double discrete; double x, y, z, t, u, v, w; nuderiv(xord, nx, i, xg, cx); x = xg[i]; nuderiv(yord, ny, ii, yg, cy); y = yg[ii]; nuderiv(zord, nz, iii, zg, cz); z = zg[iii]; nuderiv(tord, nt, iiii, tg, ct); t = tg[iiii]; nuderiv(uord, nu, iiiii, ug, cu); u = ug[iiiii]; nuderiv(vord, nv, iiiiii, vg, cv); v = vg[iiiiii]; nuderiv(word, nw, iiiiiii, wg, cw); w = wg[iiiiiii]; discrete = 0.0; /* seven cases of one partial x, y, z, t, u, v, w to any order */ if(xord!=0 && yord==0 && zord==0 && tord==0 && uord==0 && vord==0 && word==0) for(j=0; jsmaxerr) { smaxerr = err; ib = i; iib = ii; iiib = iii; iiiib = iiii; iiiiib = iiiii; iiiiiib = iiiiii; iiiiiiib = iiiiiii; } } /* end iiiiiii */ } /* end iiiiii */ } /* end iiiii */ } /* end iiii */ } /* end iii */ } /* end ii */ } /* end i */ printf("check_soln maxerr=%g \n",smaxerr); printf("at(%1d,%1d,%1d,%1d,%1d,%1d) \n",ib,iib, iiib, iiiib, iiiiib,iiiiiib); } /* end check_soln */ void write_soln(char tag[], double u[]) /* for plot6d_gl */ { FILE* outp; char name1[32] = "pde47h_nu_c"; char extn[] = ".dat"; char * name; int i, ii, iii, iiii, iiiii, iiiiii, iiiiiii; strcat(name1,tag); name = strcat(name1,extn); printf("writing solution to %s \n", name); outp = fopen(name,"w"); if(outp==NULL) { printf("ERROR unable to open %s for writing \n", name); return; exit(1); } fprintf(outp, "7 %2d %2d %2d %2d %2d %2d %2d\n",nx,ny,nz,nt,nu,nv,nw); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%d,%d,%d,%d,%d,%d,%d]=%9.4f, Ua=%9.4f, err=%e \n", i,ii,iii,iiii,iiiii,iiiiii,iiiiiii, U[s(i,ii,iii,iiii,iiiii,iiiiii,iiiiiii)], Ua[s(i,ii,iii,iiii,iiiii,iiiiii,iiiiiii)], err); } /* iiiiiiii */ } /* iiiiii */ } /* iiiii */ } /* 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=%e, avgerr=%e \n", maxerr, avgerr/(double)(nxyztuvw)); printf("\n"); printf("end pde47h_nu.c \n"); return 0; } /* end main */ /* end pde47h_nu.c */