// pdeC44h_eq.java homogeneous Biharmonic 4th order, 4 dimensions complex // solve uxxxx(x,y,z,t) + uyyyy(x,y,z,t) + uzzzz(x,y,z,t) + // utttt(x,y,z,t) + 2 uxx(x,y,z,t) + 2 uyy(x,y,z,t) + // 2 uzz(x,y,z,t) + 2 u(x,y,z,t) = 0 // // boundary conditions computed using Complex u(x,y,z,t) // analytic solution is Complex u(x,y,z,t) = sin(x,y,z,t) // uana(x,y,z,t) is used to computer boundary conditions // and check accuracy of numeric solution // // replace continuous derivatives with discrete derivatives // solve for Uijkl numerical approximation U(x_i,y_j,z_k,t_l) // A * U = F, solve simultaneous equations for U // // fourth order numerical derivative order=4, npoints=5, point=i, term=0 // new Cnuderiv(order, npoints, point, xg[], cx[]) // // d^4u/dx^4 using subscripts i,j,k,l // d^4u/dx^4 = sum(U(xg[i],yg[i],zg[k],tg[l])*cx[i]) i=0;imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+","+ii+","+iii+","+iiii+"]="+ U[s(i,ii,iii,iiii)]+", Ua="+ Ua[s(i,ii,iii,iiii)]+", err="+err); } // iiii } // iii } // ii } // i time_now = (double)System.currentTimeMillis()/1000.0; System.out.println("total CPU time = "+(time_now-time_start)+" seconds"); System.out.println(" "); System.out.println(" maxerr="+maxerr+ ", avgerr="+(avgerr/(double)(nxyzt))); System.out.println(" "); System.out.println("end pdeC44h_eq.java"); } // end pdeC44h_eq int s(int i, int ii, int iii, int iiii) // for x,y,z,t { return (i-1)*(ny-2)*(nz-2)*(nt-2) + (ii-1)*(nz-2)*(nt-2) + (iii-1)*(nt-2) + (iiii-1); } // end s int sk(int k, int i, int ii, int iii, int iiii) // for x,y,z,t { return k*(nxyzt+1) + (i-1)*(ny-2)*(nz-2)*(nt-2) + (ii-1)*(nz-2)*(nt-2) + (iii-1)*(nt-2) + (iiii-1); } // end sk int ss(int i, int ii, int iii, int iiii, int j, int jj, int jjj, int jjjj) { return s(i,ii,iii,iiii)*(nxyzt+1) + s(j,jj,jjj,jjjj); } // end ss // problem RHS, 0 // problem boundaries (and analytic solution for checking) Complex uana(Complex x, Complex y, Complex z, Complex t) { return (x.add(y.add(z.add(t)))).sin(); } void printA() { int cs, k; cs = (nx-2)*(ny-2)*(nz-2)*(nt-2); // constant RHS column for(int i=1; ismaxerr) smaxerr = err; } // end iiii } // end iii } // end ii } // end i System.out.println("check_soln maxerr="+smaxerr); } // end check_soln Complex eval_derivative(int xord, int yord, int zord, int tord, int i, int ii, int iii, int iiii, Complex u[]) { Complex cx[] = new Complex[nx]; Complex cy[] = new Complex[ny]; Complex cz[] = new Complex[nz]; Complex ct[] = new Complex[nt]; int nn = Math.max(nx, Math.max(ny, Math.max(nz, nt))); Complex p1[] = new Complex[nn]; Complex p2[] = new Complex[nn]; Complex p3[] = new Complex[nn]; Complex discrete; Complex x, y, z, t; new Cnuderiv(xord, nx, i, xg, cx); x = xg[i]; new Cnuderiv(yord, ny, ii, yg, cy); y = yg[ii]; new Cnuderiv(zord, nz, iii, zg, cz); z = zg[iii]; new Cnuderiv(tord, nt, iiii, tg, ct); t = tg[iiii]; discrete = new Complex(0.0,0.0); // four cases of one partial x, y, z, t to any order if(xord!=0 && yord==0 && zord==0 && tord==0) for(int j=0; j