/* pde_bihar44d_eq.c discretization solution biharmonic 4th order 4D * 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) + * 2*u(x,y,z,t) = f(x,y,z,t) * * f(x,y,z,t) := (y^4*z^4*t^4 + * x^4*z^4*t^4 + * x^4*y^4*t^4 + * x^4*y^4*z^4 + * 4*z^2*t^2 + * 8*y*z^3*t^3*x + * 2*y^2*z^4*t^4*x^2 + * 4*y^2*t^2 + * 8*y^3*z*t^3*x + * 2*y^4*z^2*t^4*x^2 + * 4*y^2*z^2 + * 8*y^3*z^3*t*x + * 2*y^4*z^4*t^2*x^2 + * 4*x^2*t^2 + * 8*x^3*z*t^3*y + * 2*x^4*z^2*t^4*y^2 + * 4*x^2*z^2 + * 8*x^3*z^3*t*y + * 2*x^4*z^4*t^2*y^2 + * 4*x^2*y^2 + * 8*x^3*y^3*t*z + * 2*x^4*y^4*t^2*z^2 + * 2 )*exp(x*y*z*t) * * in the hyper cube xmin< x #include #include #include #include "simeq.h" #include "deriv.h" #undef abs #define abs(a) ((a)<0.0?(-(a)):(a)) #undef max #define max(a,b) ((a)>(b)?(a):(b)) #define nx 7 #define ny 7 #define nz 7 #define nt 7 /* 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.1; static double ymin = 0.0; static double ymax = 1.2; static double zmin = 0.0; static double zmax = 1.3; static double tmin = 0.0; static double tmax = 1.4; /* global nx, hx, xg, ny, hy, yg, nz, hz, zg, nt, ht, tg needed by functions*/ static double xg[nx]; /* X grig */ 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 Ua[nxyzt]; /* analytic solution for error check */ 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; 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; int stat; printf("pde_bihar44d_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(" 2*u(x,y,z,t) = f(x,y,z,t) \n"); printf(" \n"); printf("f(x,y,z,t) := (y^4*z^4*t^4 + x^4*z^4*t^4 + x^4*y^4*t^4 +\n"); printf(" x^4*y^4*z^4 + 4*z^2*t^2 + 8*y*z^3*t^3*x +\n"); printf(" 2*y^2*z^4*t^4*x^2 + 4*y^2*t^2 + 8*y^3*z*t^3*x +\n"); printf(" 2*y^4*z^2*t^4*x^2 + 4*y^2*z^2 + 8*y^3*z^3*t*x +\n"); printf(" 2*y^4*z^4*t^2*x^2 + 4*x^2*t^2 + 8*x^3*z*t^3*y +\n"); printf(" 2*x^4*z^2*t^4*y^2 + 4*x^2*z^2 + 8*x^3*z^3*t*y +\n"); printf(" 2*x^4*z^4*t^2*y^2 + 4*x^2*y^2 + 8*x^3*y^3*t*z +\n"); printf(" 2*x^4*y^4*t^2*z^2 + 2) * exp(x*y*z*t) \n"); printf(" \n"); printf("in the hyper cube xmin< x maxerr) maxerr = err; avgerr = avgerr + err; printf("ug[%d,%d,%d,%d]=%f, Ua=%f, err=%g \n", i, ii, iii, iiii, ug[i4], Ua[i4], ug[i4]-Ua[i4]); } } } } 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 solution \n"); return 0; } /* end pde_bihar44d_eq main */ /* PDE problem definition functions f and ub */ static double F(double x, double y, double z, double t) { return (y*y*y*y*z*z*z*z*t*t*t*t + x*x*x*x*z*z*z*z*t*t*t*t + x*x*x*x*y*y*y*y*t*t*t*t + x*x*x*x*y*y*y*y*z*z*z*z + 4*z*z*t*t + 8*y*z*z*z*t*t*t*x + 2*y*y*z*z*z*z*t*t*t*t*x*x + 4*y*y*t*t + 8*y*y*y*z*t*t*t*x + 2*y*y*y*y*z*z*t*t*t*t*x*x + 4*y*y*z*z + 8*y*y*y*z*z*z*t*x + 2*y*y*y*y*z*z*z*z*t*t*x*x + 4*x*x*t*t + 8*x*x*x*z*t*t*t*y + 2*x*x*x*x*z*z*t*t*t*t*y*y + 4*x*x*z*z + 8*x*x*x*z*z*z*t*y + 2*x*x*x*x*z*z*z*z*t*t*y*y + 4*x*x*y*y + 8*x*x*x*y*y*y*t*z + 2*x*x*x*x*y*y*y*y*t*t*z*z + 2 ) * exp(x*y*z*t); } static double ub(double x, double y, double z, double t) { return exp(x*y*z*t); } 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 */ printf("discretize equation i4=%d \n", i4); /* for each term in each equation */ /* for uxxxx d^4u/dx^4 */ for(j=0; j