/* pde49hn_eq.c homogeneous Biharmonic 4th order PDE in nine dimensions * solve Uxxxx(x,y,z,t,u,v,w,p,q) + Uyyyy(x,y,z,t,u,v,w,p,q) + * Uzzzz(x,y,z,t,u,v,w,p,q) + Utttt(x,y,z,t,u,v,w,p,q) + * Uuuuu(x,y,z,t,u,v,w,p,q) + Uvvvv(x,y,z,t,u,v,w,p,q) + * Uwwww(x,y,z,t,u,v,w,p,q) + Upppp(x,y,z,t,u,v,w,p,q) + * Uqqqq(x,y,z,t,u,v,w,p,q) + * 2 Uxx(x,y,z,t,u,v,w,p,q) + 2 Uyy(x,y,z,t,u,v,w,p,q) + * 2 Uzz(x,y,z,t,u,v,w,p,q) + 2 Utt(x,y,z,t,u,v,w,p,q) + * 2 Uuu(x,y,z,t,u,v,w,p,q) + 2 Uvv(x,y,z,t,u,v,w,p,q) + * 2 Uww(x,y,z,t,u,v,w,p,q) + 2 Upp(x,y,z,t,u,v,w,p,q) + * 2 Uqq(x,y,z,t,u,v,w,p,q) + * 10 U(x,y,z,t,u,v,w,p,q) = f(x,y,z,t,u,v,w,p,q) * * boundary conditions computed using Ub(x,y,z,t,u,v,w,p,q) * analytic solution is U(x,y,z,t,u,v,w,p,q) = sin(x+y+z+t+u+v+w+p+q) * * subscripts in code use x[i], y[ii], z[i3], t[i4], u[i5], * v[i6], w[i7], p[i8], q[i9] */ #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 #define ny 5 #define nz 5 #define nt 5 #define nu 5 #define nv 5 #define nw 5 #define np 5 #define nq 5 #define ndof (nx-2)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) int s(int i, int ii, int i3, int i4, int i5, int i6, int i7, int i8, int i9) /* for x,y,z,t,u,v,w,p,q */ { int k; k = (i -1)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (ii-1)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i3-1)*(nt-2)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i4-1)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i5-1)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i6-1)*(nw-2)*(np-2)*(nq-2) + (i7-1)*(np-2)*(nq-2) + (i8-1)*(nq-2) + (i9-1); if(k<0 || k>=ndof) printf("bads ndof=%d, s(%d %d %d %d %d %d %d %d %d\n", ndof, i,ii,i3,i4,i5,i6,i7,i8,i9); return k; } /* end s */ int sk(int k, int i, int ii, int i3, int i4, int i5, int i6, int i7, int i8, int i9) /* for x,y,z,t,u,v,w,p,q */ { return k*(ndof+1) + (i- 1)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (ii-1)*(nz-2)*(nt-2)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i3-1)*(nt-2)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i4-1)*(nu-2)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i5-1)*(nv-2)*(nw-2)*(np-2)*(nq-2) + (i6-1)*(nw-2)*(np-2)*(nq-2) + (i7-1)*(np-2)*(nq-2) + (i8-1)*(nq-2) + (i9-1); } /* end sk */ int ss(int i, int ii, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int j, int jj, int j3, int j4, int j5, int j6, int j7, int j8, int j9) { return s(i,ii,i3,i4,i5,i6,i7,i8,i9)*(ndof+1) + s(j,jj,j3,j4,j5,j6,j7,j8,j9); } /* end ss */ static double A[ndof*(ndof+1)]; /* last column is RHS */ static double U[ndof]; 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 pg[np]; static double qg[nq]; static double Ua[ndof]; 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 pmin = 0.0; static double pmax = 0.5; static double qmin = 0.0; static double qmax = 0.5; static double hx, hy, hz, ht, hu, hv, hw, hp, hq; static double Ub(double x, double y, double z, double t, double u, double v, double w, double p, double q) /*analytic solution and boundaries*/ { return sin(x+y+z+t+u+v+w+p+q); } static double f(double x, double y, double z, double t, double u, double v, double w, double p, double q) /* RHS */ { return sin(x+y+z+t+u+v+w+p+q); } double eval_derivative(int xord, int yord, int zord, int tord, int uord, int vord, int word, int pord, int qord, int i, int ii, int i3, int i4, int i5, int i6, int i7, int i8, int i9, double U[]) { int j, jj, j3, j4, j5, j6, j7, j8, j9; double cx[nx]; double cy[ny]; double cz[nz]; double ct[nt]; double cu[nu]; double cv[nv]; double cw[nw]; double cp[np]; double cq[nq]; double discrete; double x, y, z, t, u, v, w, p, q; rderiv(xord, nx, i, hx, cx); x = xg[i]; rderiv(yord, ny, ii, hy, cy); y = yg[ii]; rderiv(zord, nz, i3, hz, cz); z = zg[i3]; rderiv(tord, nt, i4, ht, ct); t = tg[i4]; rderiv(uord, nu, i5, hu, cu); u = ug[i5]; rderiv(vord, nv, i6, hv, cv); v = vg[i6]; rderiv(word, nw, i7, hw, cw); w = wg[i7]; rderiv(pord, np, i8, hp, cp); p = pg[i8]; rderiv(qord, nq, i9, hq, cq); q = qg[i9]; discrete = 0.0; /* nine cases of one partial x, y, z, t, u, v, w, p, q to any order */ if(xord!=0 && yord==0 && zord==0 && tord==0 && uord==0 && vord==0 && word==0 && pord==0 && qord==0) for(j=0; jsmaxerr) { smaxerr = err; ib = i; iib = ii; i3b = i3; i4b = i4; i5b = i5; i6b = i6; i7b = i7; i8b = i8; i9b = i9; } } /* end i9 */ } /* end i8 */ } /* end i7 */ } /* end i6 */ } /* end i5 */ } /* end i4 */ } /* end i3 */ } /* end ii */ } /* end i */ printf("check_soln maxerr=%g \n",smaxerr); printf("at(%1d,%1d,%1d,%1d,%1d,%1d,%1d,%1d,%1d) \n", ib, iib, i3b, i4b, i5b, i6b, i7b, i8b, i9b); } /* end check_soln */ void write_soln(char tag[], double u[]) /* for plot9D_gl */ { FILE* outp; char name1[32] = "pde49hn_eq_c"; char extn[] = ".dat"; char * name; int i, ii, i3, i4, i5, i6, i7, i8, i9; 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, "9 %2d %2d %2d %2d %2d %2d %2d %2d %2d\n", nx, ny, nz, nt, nu, nv, nw, np, nq ); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%d,%d,%d,%d,%d,%d,%d,%d,%d]=%9.4f, Ua=%9.4f, err=%e \n", i,ii,i3,i4,i5,i6,i7,i8,i9, U[s(i,ii,i3,i4,i5,i6,i7,i8,i9)], Ua[s(i,ii,i3,i4,i5,i6,i7,i8,i9)], err); } /* i9 */ } /* i8 */ } /* i7 */ } /* i6 */ } /* i5 */ } /* i4 */ } /* i3 */ } /* 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)(ndof)); printf("\n"); printf("end pde49hn_eq.c \n"); return 0; } // end main // end pde49hn_eq.c