// pde_bihar2d_eq.java discrete solution biharmonic 4th order // // solve uxxxx(x,y) + 2*uxxyy(x,y) + uyyyy(x,y) + // 2*uxx(x,y) + 2*uyy(x,y) + 2*u(x,y) = f(x,y) // // f(x,y) := 2.4 + 0.08*x*x + 0.32*y*y + 1.6*x*y + 0.02*x*x*x*x + // 0.04*y*y*y*y - 0.08*x*x*y*y + 0.2*x*x*x*y + 0.4*y*y*y*x // // in the rectangle xmin< x maxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+","+ii+"]="+ug[i*ny+ii]+", Ua="+Ua[i*ny+ii]+ ", err="+(ug[i*ny+ii]-Ua[i*ny+ii])); } } System.out.println("xmax="+xmax+", ymax="+ymax+", nx="+nx+", ny="+ny); System.out.println(" maxerr="+maxerr+", avgerr="+ avgerr/(double)(nx*ny)); System.out.println("\n"); } // end pde_bihar2d_eq constructor // PDE problem definition functions f and ub double F(double x, double y) { return 2.4 + 0.08*x*x + 0.32*y*y + 1.6*x*y + 0.02*x*x*x*x + 0.04*y*y*y*y - 0.08*x*x*y*y + 0.2*x*x*x*y + 0.4*y*y*y*x; } double ub(double x, double y) { return 0.01*x*x*x*x + 0.02*y*y*y*y - 0.04*x*x*y*y + 0.1*x*x*x*y + 0.2*y*y*y*x - x*y + 1.0; } // solve uxxxx(x,y) + 2*uxxyy(x,y) + uyyyy(x,y) + // 2*uxx(x,y) + 2*uyy(x,y) + 2*u(x,y) = f(x,y) void discretize() // everything global i,ii (x,y) DOF // sets kg[(i*ny+ii)][(j*ny+jj)...] { if(i<1 || i>nx-1 || ii<1 || ii>ny-1) // primeter is boundary { System.out.println("discretize problem i="+i+", ii="+ii); return; } if(i==1) { if(ii==1) dset(1, 1); // offset is negative of x,y point else if(ii==ny-2) dset(1, 3); else dset(1, 2); } else if(ii==1) { if(i==1) dset(1, 1); else if(i==nx-2) dset(3, 1); else dset(2, 1); } else if(i==nx-2) { if(ii==1) dset(3, 1); else if(ii==ny-2) dset(3, 3); else dset(3, 2); } else if(ii==ny-2) { if(i==1) dset(1, 3); else if(i==nx-2) dset(3, 3); else dset(2, 3); } else dset(2, 2); // center case } // end discretize void dset(int k, int kk) // x point, y point negative for offset { double cxxxx[] = new double[5]; double cyyyy[] = new double[5]; double cxx [] = new double[5]; double cyy [] = new double[5]; double cxxyy[][] = new double[5][5]; double pxg [] = new double[5]; double pyg [] = new double[5]; if(i-k<0 || i-k+4>nx-1 || ii-kk<0 || ii-kk+4>ny-1) { System.out.println("dset problem k="+k+", kk="+kk+ " for i="+i+", ii="+ii); return; } System.out.println("dset k="+k+", kk="+kk+", row="+(i*ny+ii)); for(int m=0; m<5; m++) { pxg[m] = xg[i-k+m]; // offset pyg[m] = yg[ii-kk+m]; } new nuderiv(4, 5, k, pxg, cxxxx); new nuderiv(2, 5, k, pxg, cxx); new nuderiv(4, 5, kk, pyg, cyyyy); new nuderiv(2, 5, kk, pyg, cyy); for(int mx=0; mx<5; mx++) { for(int my=0; my<5; my++) cxxyy[mx][my] = cxx[mx]*cyy[my]; } for(int mx=0; mx<5; mx++) // process all 25 cells { for(int my=0; my<5; my++) { // optional, if boundary not in A and U //if(my==ii && (i-k+mx==0 || i-k+mx==nx-1)) // x boundary //{ // fg[i*ny+ii] -= ub(xg[i-k+mx],yg[ii-kk+my])*cxxxx[mx]; // fg[i*ny+ii] -= 2.0*ub(xg[i-k+mx],yg[ii-kk+my])*cxx[mx]; // if(i==1 && ii==1) // { // System.out.println("bound i="+i+",ii="+ii+", mx="+mx+", my="+my); // System.out.println("RHS cxxxx- "+ // (ub(xg[i-k+mx],yg[ii-kk+my])*cxxxx[mx])); // System.out.println("RHS cxx- "+ // (2.0*ub(xg[i-k+mx],yg[ii-kk+my])*cxx[mx])); // } //} //else if(mx==i && (ii-kk+my==0 || ii-kk+my==ny-1)) // y boundary //{ // fg[i*ny+ii] -= ub(xg[i-k+mx],yg[ii-kk+my])*cyyyy[my]; // fg[i*ny+ii] -= 2.0*ub(xg[i-k+mx],yg[ii-kk+my])*cyy[my]; // if(i==1 && ii==1) // { // System.out.println("bound i="+i+",ii="+ii+", mx="+mx+", my="+my); // System.out.println("RHS cyyyy- "+ // (ub(xg[i-k+mx],yg[ii-kk+my])*cyyyy[my])); // System.out.println("RHS cyy- "+ // (2.0*ub(xg[i-k+mx],yg[ii-kk+my])*cyy[my])); // } //} //else if(i-k+mx==0 || i-k+mx==nx-1 || ii-kk+my==0 || ii-kk+my==ny-1) //{ // xxyy boundary // fg[i*ny+ii] -= 2.0*ub(xg[i-k+mx],yg[ii-kk+my])*cxxyy[mx][my]; // if(i==1 && ii==1) // { // System.out.println("bound i="+i+",ii="+ii+", mx="+mx+", my="+my); // System.out.println("RHS cxxyy- "+ // (2.0*ub(xg[i-k+mx],yg[ii-kk+my])*cxxyy[mx][my])); // } //} //else //{ if(kk==my) // Uxxxx and Uxx { kg[(i*ny+ii)][(i-k+mx)*ny+ii] += cxxxx[mx]; kg[(i*ny+ii)][(i-k+mx)*ny+ii] += 2.0*cxx[mx]; } if(k==mx) // Uyyyy and Uyy { kg[(i*ny+ii)][i*ny+(ii-kk+my)] += cyyyy[my]; kg[(i*ny+ii)][i*ny+(ii-kk+my)] += 2.0*cyy[my]; } // Uxxyy kg[(i*ny+ii)][(i-k+mx)*ny+(ii-kk+my)] += 2.0*cxxyy[mx][my]; //} } // end my } // end mx kg[(i*ny+ii)][(i*ny+ii)] += 2.0; // U } // end dset void write_soln() { try { FileWriter fout = new FileWriter("pde_bihar2d_eq.dat"); BufferedWriter fileout = new BufferedWriter(fout); System.out.println("writing pde_bihar2d_eq.dat"); for(int i=0; i