/* pde64sb_eq.c discretize, build linear equations, solve biharmonic * nabla^4 P(x,y,z,t,u,v) + 2 nabla^2 P(x,y,z,t,u,v) = F(x,y,z,t,u,v) * * solve Pxxxx(x,y,z,t,u,v) + Pyyyy(x,y,z,t,u,v) + Pzzzz(x,y,z,t,u,v) + * Ptttt(x,y,z,t,u,v) + Puuuu(x,y,z,t,u,v) + Pvvvv(x,y,z,t,u,v) + * 2*(Pxx(x,y,z,t,u,v) + Pyy(x,y,z,t,u,v) + Pzz(x,y,z,t,u,v) + * Ptt(x,y,z,t,u,v) + Puu(x,y,z,t,u,v) + Pvv(x,y,z,t,u,v)) = * F(x,y,z,t,u,v) * F(x,y,z,t,u,v) = see d6p4sb_rhs.jpg * * boundary conditions computed using P(x,y,z,t,u,v) * analytic solution is P(x,y,z,t,u,v) = sin(x*u+y*v+z+t) * */ #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 nxyztuv (nx-2)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2) static double A[nxyztuv*(nxyztuv+1)]; /* last column is RHS */ static double U[nxyztuv]; /* computed solution */ static double Ua[nxyztuv]; /* known solution when testing */ static double xg[nx]; /* grid coordinates */ static double yg[ny]; static double zg[nz]; static double tg[nt]; static double ug[nt]; static double vg[nt]; static double xmin = -0.5; /* problem parameters */ static double xmax = 0.5; /* for nx = 5 */ static double ymin = -0.5; static double ymax = 0.5; static double zmin = -0.5; static double zmax = 0.5; static double tmin = -0.5; static double tmax = 0.5; static double umin = -0.5; static double umax = 0.5; static double vmin = -0.5; static double vmax = 0.5; /* derivative point arrays, static in this version, [point][term] */ static double cxx[nx][nx], cyy[ny][ny], czz[nz][nz], ctt[nt][nt], cuu[nu][nu], cvv[nv][nv]; static double cxxxx[nx][nx], cyyyy[ny][ny], czzzz[nz][nz], ctttt[nt][nt], cuuuu[nu][nu], cvvvv[nv][nv]; static double hx, hy, hz, ht, hu, hv; int s(int i, int ii, int iii, int iiii, int iiiii, int iiiiii) /* for x,y,z,t,u,v */ { return (i-1)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2) + (ii-1)*(nz-2)*(nt-2)*(nu-2)*(nv-2) + (iii-1)*(nt-2)*(nu-2)*(nv-2) + (iiii-1)*(nu-2)*(nv-2) + (iiiii-1)*(nv-2) + (iiiiii-1); } /* end s */ int sk(int k, int i, int ii, int iii, int iiii, int iiiii, int iiiiii) /* for x,y,z,t,u,v */ { return k*(nxyztuv+1) + (i-1)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2) + (ii-1)*(nz-2)*(nt-2)*(nu-2)*(nv-2) + (iii-1)*(nt-2)*(nu-2)*(nv-2) + (iiii-1)*(nu-2)*(nv-2) + (iiiii-1)*(nv-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)*(nxyztuv+1) + s(j,jj,jjj,jjjj,jjjjj,jjjjjj); } /* end ss */ double f(double x, double y, double z, double t, double u, double v) { double x2, x4, y2, y4, z2, z4, t2, t4, u2, u4, v2, v4; double cscc, csss, ccsc, cccs, scss, sssc, sscs, sccc; x2 = x*x; x4 = x2*x2; y2 = y*y; y4 = y2*y2; z2 = z*z; z4 = z2*z2; t2 = t*t; t4 = t2*t2; u2 = u*u; u4 = u2*u2; v2 = v*v; v4 = v2*v2; cscc = cos(x*u)*sin(y*v)*cos(z)*cos(t); csss = cos(x*u)*sin(y*v)*sin(z)*sin(t); ccsc = cos(x*u)*cos(y*v)*sin(z)*cos(t); cccs = cos(x*u)*cos(y*v)*cos(z)*sin(t); scss = sin(x*u)*cos(y*v)*sin(z)*sin(t); sssc = sin(x*u)*sin(y*v)*sin(z)*cos(t); sscs = sin(x*u)*sin(y*v)*cos(z)*sin(t); sccc = sin(x*u)*cos(y*v)*cos(z)*cos(t); return 2.0*sssc + 2.0*scss - 2.0*sccc + 2.0*sscs - 2.0*cscc - 2.0*ccsc + 2.0*csss - 2.0*cccs - x4*sssc - x4*sscs + x4*cscc - x4*csss + x4*ccsc + x4*cccs - 2.0*u2*sccc + 2.0*u2*scss + 2.0*u2*sssc + 2.0*u2*sscs - 2.0*u2*cscc + 2.0*u2*csss - 2.0*u2*ccsc - 2.0*u2*cccs - 2.0*y2*cccs - 2.0*v2*sccc + 2.0*v2*scss + 2.0*v2*sssc + 2.0*v2*sscs - 2.0*v2*cscc + 2.0*v2*csss - 2.0*v2*ccsc - 2.0*v2*cccs - 2.0*x2*sccc + 2.0*x2*scss + 2.0*x2*sssc + 2.0*x2*sscs - 2.0*x2*cscc + 2.0*x2*csss - 2.0*x2*ccsc - 2.0*x2*cccs - 2.0*y2*sccc + 2.0*y2*scss + 2.0*y2*sssc + 2.0*y2*sscs - 2.0*y2*cscc + 2.0*y2*csss - 2.0*y2*ccsc + y4*sccc - y4*scss - y4*sssc - y4*sscs + y4*cscc - y4*csss + y4*ccsc + y4*cccs + u4*sccc - u4*scss - u4*sssc - u4*sscs + u4*cscc - u4*csss + u4*ccsc + u4*cccs + v4*sccc - v4*scss - v4*sssc - v4*sscs + v4*cscc - v4*csss + v4*ccsc + v4*cccs + x4*sccc - x4*scss; } double pana(double x, double y, double z, double t, double u, double v) /*analytic solution and boundaries*/ { return sin(x*u+y*v+z+t); } void printA() { int i, ii, iii, iiii, iiiii, iiiiii, j, jj, jjj, jjjj, jjjjj, jjjjjj, cs, k; cs = (nx-2)*(ny-2)*(nz-2)*(nt-2)*(nu-2)*(nv-2); /* constant RHS column */ for(i=1; i0.001)printf("%1d %1d %1d %1d %1d %1d est=%e err=%e \n", i,ii,iii,iiii,iiiii,iiiiii,est,err); */ /* end terms */ } /* end iiiiii loop */ } /* end iiiii loop */ } /* end iiii loop */ } /* end iii loop */ } /* end ii loop */ } /* end i loop */ printf("check against PDE, smaxerr=%e \n", smaxerr); } /* end check_soln */ void write_soln(char tag[], double u[]) /* for plot6d_gl */ { FILE* outp; char name1[32] = "pde64sb_eq_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", nx, ny, nz, nt, nu, nv); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%1d,%1d,%1d,%1d,%1d,%1d]=%9.4f, Ua=%9.4f, err=%g \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 */ write_soln("", U); printf(" maxerr=%g, avgerr=%g \n", maxerr, avgerr/(double)(nx*ny*nz*nt)); printf("\n"); printf("check known against PDE \n"); check_soln(Ua); printf("check solution against PDE \n"); check_soln(U); time_now = (double)clock()/(double)CLOCKS_PER_SEC; printf("total CPU time = %f seconds \n", time_now-time_start); printf("\n"); printf("end pde64sb_eq.c \n"); return 0; } /* end main */ /* end pde64sb_eq.c */