/* pde45h_eq.c homogeneous Biharmonic PDE in five dimensions * solve uwwww(w,x,y,z,t) + uxxxx(w,x,y,z,t) + uyyyy(w,x,y,z,t) + * uzzzz(w,x,y,z,t) + utttt(w,x,y,z,t) + 2 uww(w,x,y,z,t) + * 2 uxx(w,x,y,z,t) + 2 uyy(w,x,y,z,t) + 2 uzz(w,x,y,z,t) + * 2 utt(w,x,y,z,t) + 5 u(w,x,y,z,t) = 0 * * boundary conditions computed using u(w,x,y,z,t) * analytic solution is u(w,x,y,z,t) = sin(w+x+y+z+t) * * subscripts in code use w[i], x[ii], y[iii], z[iiii], t[iiiii] */ #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 nw 6 #define nx 6 #define ny 6 #define nz 6 #define nt 6 #define nwxyzt (nw-2)*(nx-2)*(ny-2)*(nz-2)*(nt-2) int s(int i, int ii, int iii, int iiii, int iiiii) /* for w,x,y,z,t */ { int k; k = (i-1)*(nx-2)*(ny-2)*(nz-2)*(nt-2) + (ii-1)*(ny-2)*(nz-2)*(nt-2) + (iii-1)*(nz-2)*(nt-2) + (iiii-1)*(nt-2) + (iiiii-1); if(k<0 || k>=nwxyzt) printf("bad s(%d %d %d %d %d\n",i,ii,iii,iiii,iiiii); return k; } /* end s */ int sk(int k, int i, int ii, int iii, int iiii, int iiiii) /* for w,x,y,z,t */ { return k*(nwxyzt+1) + (i-1)*(nx-2)*(ny-2)*(nz-2)*(nt-2) + (ii-1)*(ny-2)*(nz-2)*(nt-2) + (iii-1)*(nz-2)*(nt-2) + (iiii-1)*(nt-2) + (iiiii-1); } /* end sk */ int ss(int i, int ii, int iii, int iiii, int iiiii, int j, int jj, int jjj, int jjjj, int jjjjj) { return s(i,ii,iii,iiii,iiiii)*(nwxyzt+1) + s(j,jj,jjj,jjjj,jjjjj); } /* end ss */ static double A[nwxyzt*(nwxyzt+1)]; /* last column is RHS */ static double U[nwxyzt]; static double wg[nw]; static double xg[nx]; static double yg[ny]; static double zg[nz]; static double tg[nt]; static double Ua[nwxyzt]; static double wmin = 0.0; /* problem parameters */ static double wmax = 1.5708; static double xmin = 0.0; static double xmax = 1.5708; static double ymin = 0.0; static double ymax = 1.5708; static double zmin = 0.0; static double zmax = 1.5708; static double tmin = 0.0; static double tmax = 1.5708; static double hw, hx, hy, hz, ht; static double uana(double w, double x, double y, double z, double t) /*analytic solution and boundaries*/ { return sin(w+x+y+z+t); } double eval_derivative(int word, int xord, int yord, int zord, int tord, int i, int ii, int iii, int iiii, int iiiii, double u[]) { int j, jj, jjj, jjjj, jjjjj; double cw[nw]; double cx[nx]; double cy[ny]; double cz[nz]; double ct[nt]; double discrete; double w, x, y, z, t; rderiv(word, nw, i, hw, cw); w = wg[i]; rderiv(xord, nx, ii, hx, cx); x = xg[ii]; rderiv(yord, ny, iii, hy, cy); y = yg[iii]; rderiv(zord, nz, iiii, hz, cz); z = zg[iiii]; rderiv(tord, nt, iiiii, ht, ct); t = tg[iiiii]; discrete = 0.0; /* five cases of one partial w, x, y, z, t to any order */ if(word!=0 && xord==0 && yord==0 && zord==0 && tord==0) for(j=0; jsmaxerr) smaxerr = err; } /* end iiiii */ } /* end iiii */ } /* end iii */ } /* end ii */ } /* end i */ printf("check_soln maxerr=%g \n",smaxerr); } /* end check_soln */ void write_soln(char tag[], double u[]) /* for plot5d_gl */ { FILE* outp; char name1[32] = "pde45h_eq_c"; char extn[] = ".dat"; char * name; int i, ii, iii, iiii, iiiii; 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); exit(1); } fprintf(outp, "5 %2d %2d %2d %2d %2d \n", nw, nx, ny, nz, nt); for(i=1; imaxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%d,%d,%d,%d,%d]=%9.4f, Ua=%9.4f, err=%g \n", i,ii,iii,iiii,iiiii,U[s(i,ii,iii,iiii,iiiii)], Ua[s(i,ii,iii,iiii,iiiii)], err); } /* 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)(nwxyzt)); printf("\n"); printf("end pde45h_eq.c \n"); return 0; } /* end main */ /* end pde45h_eq.c */