/* pde_bihar44tl_eq.c discretization solution biharmonic 4th order 4D * using pthreads * solve uxxxx(x,y,z,t) + uyyyy(x,y,z,t) + uzzzz(x,y,z,t) + utttt(x,y,z,t) + * 2*uxxyy(x,y,z,t) + 2*uxxzz(x,y,z,t) + 2*uxxtt(x,y,z,t) + * 2*uyyzz(x,y,z,t) + 2*uyytt(x,y,z,t) + 2*uzztt(x,y,z,t) - * 16*u(x,y,z,t) = f(x,y,z,t) * * f(x,y,z,t) := 0.0 * * in the hyper cube xmin< x #include #include #include #include #include "tsimeq.h" #include "lderiv.h" #undef abs #define abs(a) ((a)<0.0?(-(a)):(a)) #undef max #define max(a,b) ((a)>(b)?(a):(b)) #define nx 12 #define ny 12 #define nz 12 #define nt 12 /* DOF not including boundary */ #define nxyzt (nx-2)*(ny-2)*(nz-2)*(nt-2) static int debug = 0; static double xmin = 0.0; /* problem parameters */ static double xmax = 1.57; static double ymin = 0.0; static double ymax = 1.57; static double zmin = 0.0; static double zmax = 1.57; static double tmin = 0.0; static double tmax = 1.57; /* global nx, hx, xg, ny, hy, yg, nz, hz, zg, nt, ht, tg needed by functions*/ static double xg[nx]; /* X grid */ static double yg[ny]; /* Y grid */ static double zg[ny]; /* z grid */ static double tg[ny]; /* t grid */ static double hx, hy, hz, ht; static double ug[nxyzt]; /* solution, does not include boundary */ static double kg[nxyzt][nxyzt+1]; /* simultaneous equations, incl RHS */ static double maxerr; static double cxxxx[nx][nx]; static double cyyyy[ny][ny]; static double czzzz[nz][nz]; static double ctttt[nt][nt]; static double cxx[nx][nx]; static double cyy[ny][ny]; static double czz[nz][nz]; static double ctt[nt][nt]; /* cxxyy etc. built dynamically */ /* function prototypes */ static double F(double x, double y, double z, double t); /* RHS */ static double ub(double x, double y, double z, double t); static void discretize(int i, int ii, int iii, int iiii); static void dsetup(); static void write_soln(); static void check_soln(); static int s(int i, int ii, int iii, int iiii) /* index 1..nx-1 etc */ { return (i-1) + (ii-1)*(nx-2) + (iii-1)*(nx-2)*(ny-2) + (iiii-1)*(nx-2)*(ny-2)*(nz-2); } /* end s */ int main(int argc, char * argv[]) { double x, y, z, t, u; int i, ii, iii, iiii, j, jj, jjj, jjjj; int i4; /* s(i,ii,iii,iiii) */ int j4; /* s(j,jj,jjj,jjjj) */ double val, err, avgerr, tstart, tnext, tnow; int stat; tstart = (double)time(NULL); printf("pde_bihar44tl_eq.c running.\n"); printf("solve uxxxx(x,y,z,t) + uyyyy(x,y,z,t) +\n"); printf(" uzzzz(x,y,z,t) + utttt(x,y,z,t) +\n"); printf(" 2*uxxyy(x,y,z,t) + 2*uxxzz(x,y,z,t) + 2*uxxtt(x,y,z,t) +\n"); printf(" 2*uyyzz(x,y,z,t) + 2*uyytt(x,y,z,t) + 2*uzztt(x,y,z,t) -\n"); printf(" 16*u(x,y,z,t) = f(x,y,z,t) \n"); printf(" \n"); printf("f(x,y,z,t) := 0.0\n"); printf(" \n"); printf("in the hyper cube xmin< x maxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%d,%d,%d,%d]=%f, u=%f, err=%g \n", i, ii, iii, iiii, ug[i4], u, ug[i4]-u); } } } } printf("xmax=%f, ymax=%f, xmax=%f, tmax=%f \n", xmax, ymax, zmax, tmax); printf("nx=%d, ny=%d, nz=%d, nt=%d \n", nx, ny, nz, nt); printf(" maxerr=%g, avgerr=%g \n", maxerr,avgerr/(double)(nxyzt)); printf("\n"); fflush(stdout); printf("use plot4d_gl to see results \n"); tnow = (double)time(NULL); printf("time for checking and writing = %f seconds \n", tnow-tnext); printf("total time = %f seconds \n", tnow-tstart); return 0; } /* end pde_bihar44tl_eq main */ /* PDE problem definition functions f and ub */ static double F(double x, double y, double z, double t) { return 0.0; } static double ub(double x, double y, double z, double t) { return sin(x+y+z+t); /* boundary, and used here for checking */ } static void discretize(int i, int ii, int iii, int iiii) /* sets kg[s(i,ii,iii,iiii)][s(j,jj,jjj,jjjj)...] */ /* this code unique to this specific PDE */ { int cs = nxyzt; /* RHS index */ int i4; int j, jj, jjj, jjjj; double val; i4 = s(i,ii,iii,iiii); /* equation index */ /* for each term in each equation */ /* for uxxxx d^4u/dx^4 */ for(j=0; j