/* pde46h_nu.c homogeneous Biharmonic PDE in six dimensions * solve Uvvvv(v,w,x,y,z,t) + Uwwww(v,w,x,y,z,t) + Uxxxx(v,w,x,y,z,t) + * Uyyyy(v,w,x,y,z,t) + Uzzzz(v,w,x,y,z,t) + Utttt(v,w,x,y,z,t) + * 2 Uvv(v,w,x,y,z,t) + 2 Uww(v,w,x,y,z,t) + 2 Uxx(v,w,x,y,z,t) + * 2 Uyy(v,w,x,y,z,t) + 2 Uzz(v,w,x,y,z,t) + 2 Utt(v,w,x,y,z,t) + * 6 U(v,w,x,y,z,t) = 0 * * boundary conditions computed using uana(v,w,x,y,z,t) * analytic solution is U(v,w,x,y,z,t) = sin(v+w+x+y+z+t) * * subscripts in code use v[i], w[ii], x[iii], y[iiii], z[iiiii], t[iiiiii] */ #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 nv 6 #define nw 6 #define nx 6 #define ny 6 #define nz 6 #define nt 6 #define nvwxyzt (nv-2)*(nw-2)*(nx-2)*(ny-2)*(nz-2)*(nt-2) int s(int i, int ii, int iii, int iiii, int iiiii, int iiiiii) /* for v,w,x,y,z,t */ { int k; k = (i-1)*(nw-2)*(nx-2)*(ny-2)*(nz-2)*(nt-2) + (ii-1)*(nx-2)*(ny-2)*(nz-2)*(nt-2) + (iii-1)*(ny-2)*(nz-2)*(nt-2) + (iiii-1)*(nz-2)*(nt-2) + (iiiii-1)*(nt-2) + (iiiiii-1); if(k<0 || k>=nvwxyzt) printf("bad s(%d %d %d %d %d %d\n", i,ii,iii,iiii,iiiii,iiiiii); return k; } /* end s */ int sk(int k, int i, int ii, int iii, int iiii, int iiiii, int iiiiii) /* for v,w,x,y,z,t */ { return k*(nvwxyzt+1) + (i-1)*(nw-2)*(nx-2)*(ny-2)*(nz-2)*(nt-2) + (ii-1)*(nx-2)*(ny-2)*(nz-2)*(nt-2) + (iii-1)*(ny-2)*(nz-2)*(nt-2) + (iiii-1)*(nz-2)*(nt-2) + (iiiii-1)*(nt-2) + (iiiiii-1); } /* end sk */ int ss(int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int j, int jj, int jjj, int jjjj, int jjjjj, int jjjjjj) { return s(i,ii,iii,iiii,iiiii,iiiiii)*(nvwxyzt+1) + s(j,jj,jjj,jjjj,jjjjj,jjjjjj); } /* end ss */ static double A[nvwxyzt*(nvwxyzt+1)]; /* last column is RHS */ static double U[nvwxyzt]; static double vg[nv]; static double wg[nw]; static double xg[nx]; static double yg[ny]; static double zg[nz]; static double tg[nt]; static double Ua[nvwxyzt]; static double vmin = 0.0; /* problem parameters */ static double vmax = 1.5708; static double wmin = 0.0; 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 hv, hw, hx, hy, hz, ht; static double uana(double v, double w, double x, double y, double z, double t) /*analytic solution and boundaries*/ { return sin(v+w+x+y+z+t); } double eval_derivative(int vord, int word, int xord, int yord, int zord, int tord, int i, int ii, int iii, int iiii, int iiiii, int iiiiii, double u[]) { int j, jj, jjj, jjjj, jjjjj, jjjjjj; double cv[nv]; double cw[nw]; double cx[nx]; double cy[ny]; double cz[nz]; double ct[nt]; double discrete; double v, w, x, y, z, t; nuderiv(vord, nv, i, vg, cv); v = vg[i]; nuderiv(word, nw, ii, wg, cw); w = wg[ii]; nuderiv(xord, nx, iii, xg, cx); x = xg[iii]; nuderiv(yord, ny, iiii, yg, cy); y = yg[iiii]; nuderiv(zord, nz, iiiii, zg, cz); z = zg[iiiii]; nuderiv(tord, nt, iiiiii, tg, ct); t = tg[iiiiii]; discrete = 0.0; /* six cases of one partial v, w, x, y, z, t to any order */ if(vord!=0 && word==0 && xord==0 && yord==0 && zord==0 && tord==0) for(j=0; jsmaxerr) { smaxerr = err; ib = i; iib = ii; iiib = iii; iiiib = iiii; iiiiib = iiiii; iiiiiib = iiiiii; } } /* end iiiii */ } /* 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] = "pde46h_nu_c"; char extn[] = ".dat"; char * name; int i, ii, iii, iiii, iiiii, iiiiii; 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, "6 %2d %2d %2d %2d %2d %2d\n", nv, nw, nx, ny, nz, nt); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%d,%d,%d,%d,%d,%d]=%9.4f, Ua=%9.4f, err=%e \n", i,ii,iii,iiii,iiiii,iiiiii, U[s(i,ii,iii,iiii,iiiii,iiiiii)], Ua[s(i,ii,iii,iiii,iiiii,iiiiii)], err); } /* 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)(nvwxyzt)); printf("\n"); printf("end pde46h_nu.c \n"); return 0; } /* end main */ /* end pde46h_nu.c */