// boltzmann_7la.java Galerkin FEM // // solve one version of Boltzmann Equation in 7 independent variables // I call it 7 dimensions, x,y,z in 3 space, t time domain, // p,q,r momentum in x,y,z directions usually called px, py, pz // // I call the desired solution U(x,y,z,t,p,q,r) here, typically // the probability of molecules f(x,y,z,t,px,py,pz) being // in phase space volume dx,dy,dz at x,y,z // in momentum space dpx,dpy,dpz at px,py,pz at time t // // partial derivative with respect to x is Ux, etc // Ux(x,y,z,t,p,q,r) + Uy(x,y,z,t,p,q,r) + Uz(x,y,z,t,p,q,r) + // Ut(x,y,z,t,p,q,r) + Sp*Up(x,y,z,t,p,q,r) + Sq*Uq(x,y,z,t,p,q,r) + // Sr*Ur(x,y,z,t,p,q,r) = Sf(x,y,z,t,p,q,r) // Where Sf is the forcing function, Sp, Sq, Sr probabilities // taken as constant here, yet may be a function of x,y,z,t // // boundary conditions, computed using Ub(x,y,z,t,p,q,r) // were chosen, arbitrarily, // for purpose of comparing different solution methods. // // gauss-legendre integration used // solve for Uijkluvw numerical approximation of // U(x_i,y_ii,z_iii,t_iiii,p_iiiii,q_iiiiii,r_iiiiiii) // kg * ug = fg, stiffness matrix times unknown U equal forcing function // solve simultaneous equations for U import java.io.*; class boltzmann_7la { // i, j, nx, xg, ii, jj, ny, yg ... needed by galk or galf, available at call final int nx = 3; // do not need to be the same final int ny = 3; final int nz = 3; final int nt = 3; final int np = 3; final int nq = 3; final int nr = 3; final int nxyztpqr = nx*ny*nz*nt*np*nq*nr; double xg[] = new double[nx]; double yg[] = new double[ny]; double zg[] = new double[nz]; double tg[] = new double[nt]; double pg[] = new double[np]; double qg[] = new double[nq]; double rg[] = new double[nr]; int i, j, ii, jj, iii, jjj, iiii, jjjj; int iiiii, jjjjj, iiiiii, jjjjjj, iiiiiii, jjjjjjj; double x, y, z, t, p, q, r, hx, hy, hz, ht, hp, hq, hr; laphi L = new laphi(); boltzmann_7la() { final int npx = 4; // Gauss Legendre integration order final int npy = 4; // do not need to be the same final int npz = 4; final int npt = 4; final int npp = 4; final int npq = 4; final int npr = 4; double xx[] = new double[npx+1]; double wx[] = new double[npx+1]; // for Gauss-Legendre double yy[] = new double[npy+1]; double wy[] = new double[npy+1]; // for Gauss-Legendre double zz[] = new double[npz+1]; double wz[] = new double[npz+1]; // for Gauss-Legendre double tt[] = new double[npt+1]; double wt[] = new double[npt+1]; // for Gauss-Legendre double pp[] = new double[npp+1]; double wp[] = new double[npp+1]; // for Gauss-Legendre double qq[] = new double[npq+1]; double wq[] = new double[npq+1]; // for Gauss-Legendre double rr[] = new double[npr+1]; double wr[] = new double[npr+1]; // for Gauss-Legendre double val, err, avgerr, maxerr; int px, py, pz, pt, pa, pq, pr; // pp used, thus pa double xmin = 0.1; // problem parameters double xmax = 0.7; double ymin = 0.1; double ymax = 0.7; double zmin = 0.1; double zmax = 0.7; double tmin = 0.1; double tmax = 0.7; double pmin = 0.1; double pmax = 0.7; double qmin = 0.1; double qmax = 0.7; double rmin = 0.1; double rmax = 0.7; double kg[] = new double[nxyztpqr*nxyztpqr]; double fg[] = new double[nxyztpqr]; double ug[] = new double[nxyztpqr]; double Ua[] = new double[nxyztpqr]; double t_start, t_init, t_kf, t_simeq, t_end; System.out.println("boltzmann_7la.c running"); System.out.println("Given Ux(x,y,z,t,p,q,r)+Uy(x,y,z,t,p,q,r)+Uz(x,y,z,t,p,q,r)+"); System.out.println("Ut(x,y,z,t,p,q,r)+Up(x,y,z,t,p,q,r)+Uq(x,y,z,t,p,q,t)+"); System.out.println("Ur(x,y,z,t,p,q,r,z) = Sf(x,y,z,t)"); System.out.println("Sf(x,y,z,t,p,q,r) = RHS"); System.out.println("xmin<=x<=xmax ymin<=y<=ymax zmin<=z<=zmax "); System.out.println("tmin<=t<=tmax pmin<=p<=pmax qmin<=q<=qmax "); System.out.println("rmin<=r<=rmax Boundaries"); System.out.println("Analytic solution U(x,y,z,t,p,q,r) = x*y*z*t*p*q*r "); System.out.println(" "); System.out.println("xmin="+xmin+", xmax="+xmax+", ymin="+ymin+", ymax="+ymax); System.out.println("zmin="+zmin+", zmax="+zmax+", tmin="+tmin+", tmax="+tmax); System.out.println("pmin="+pmin+", pmax="+pmax+", qmin="+qmin+", qmax="+qmax); System.out.println("rmin="+rmin+", rmax="+rmax); System.out.println("nx="+nx+", ny="+ny+", nz="+nz+", nt="+nt); System.out.println("np="+np+", nq="+nq+", nr="+nr); System.out.println(" "); t_start = System.currentTimeMillis(); System.out.println("x grid and analytic solution at ymin,zmin,tmin "); hx = (xmax-xmin)/(double)(nx-1); for(int i=0; imaxerr) maxerr = err; avgerr = avgerr + err; System.out.println("ug["+i+","+ii+","+iii+","+iiii+ ","+iiiii+","+iiiiii+","+iiiiiii+"]="+ ug[s(i,ii,iii,iiii,iiiii,iiiiii,iiiiiii)]+ ", Ua="+Ua[s(i,ii,iii,iiii,iiiii,iiiiii,iiiiiii)]+ ", err="+(ug[s(i,ii,iii,iiii,iiiii,iiiiii,iiiiiii)]- Ua[s(i,ii,iii,iiii,iiiii,iiiiii,iiiiiii)])); } } } } } } } System.out.println(" maxerr="+maxerr+", avgerr="+ avgerr/(double)(nxyztpqr)); write_soln(ug); t_end = System.currentTimeMillis(); System.out.println("total took "+((t_end-t_start)/1000.0)+" seconds"); System.out.println(" "); } // end boltzmann_7la constructor // utility functions to compute indices int s(int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int iiiiiii) { return i*ny*nz*nt*np*nq*nr+ ii*nz*nt*np*nq*nr+ iii*nt*np*nq*nr+ iiii*np*nq*nr+ iiiii*nq*nr+ iiiiii*nr+ iiiiiii; } // end s int ss(int i, int ii, int iii, int iiii, int iiiii, int iiiiii, int iiiiiii, int j, int jj, int jjj, int jjjj, int jjjjj, int jjjjjj, int jjjjjjj) { return s(i,ii,iii,iiii,iiiii,iiiiii,iiiiiii)*nxyztpqr+ s(j,jj,jjj,jjjj,jjjjj,jjjjjj,jjjjjjj); } // end ss // PDE problem definition functions double Sf(double x, double y, double z, double t, double p, double q, double r) // forcing function, F(x,y,z,t) { return y*z*t*p*q*r + x*z*t*p*q*r + x*y*t*p*q*r + x*y*z*p*q*r + x*y*z*t*p*r + x*y*z*t*p*q; } double Ub(double x, double y, double z, double t, double p, double q, double r) // analytic solution and boundaries { return x*y*z*p*q*r*t; } double galk(double x, double y, double z, double t, double p, double q, double r) // Galerkin k stiffness function for this problem { return (L.phip(x,j,nx-1,xg)*L.phi(y,jj,ny-1,yg)*L.phi(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg)*L.phi(p,jjjjj,np-1,pg)*L.phi(q,jjjjjj,nq-1,qg)* L.phi(r,jjjjjjj,nr-1,rg)+ L.phi(x,j,nx-1,xg)*L.phip(y,jj,ny-1,yg)*L.phi(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg)*L.phi(p,jjjjj,np-1,pg)*L.phi(q,jjjjjj,nq-1,qg)* L.phi(r,jjjjjjj,nr-1,rg)+ L.phi(x,j,nx-1,xg)*L.phi(y,jj,ny-1,yg)*L.phip(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg)*L.phi(p,jjjjj,np-1,pg)*L.phi(q,jjjjjj,nq-1,qg)* L.phi(r,jjjjjjj,nr-1,rg)+ L.phi(x,j,nx-1,xg)*L.phi(y,jj,ny-1,yg)*L.phi(z,jjj,nz-1,zg)* L.phip(t,jjjj,nt-1,tg)*L.phi(p,jjjjj,np-1,pg)*L.phi(q,jjjjjj,nq-1,qg)* L.phi(r,jjjjjjj,nr-1,rg)+ L.phi(x,j,nx-1,xg)*L.phi(y,jj,ny-1,yg)*L.phi(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg)*L.phip(p,jjjjj,np-1,pg)*L.phi(q,jjjjjj,nq-1,qg)* L.phi(r,jjjjjjj,nr-1,rg)+ L.phi(x,j,nx-1,xg)*L.phi(y,jj,ny-1,yg)*L.phi(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg)*L.phi(p,jjjjj,np-1,pg)*L.phip(q,jjjjjj,nq-1,qg)* L.phi(r,jjjjjjj,nr-1,rg)+ L.phi(x,j,nx-1,xg)*L.phi(y,jj,ny-1,yg)*L.phi(z,jjj,nz-1,zg)* L.phi(t,jjjj,nt-1,tg)*L.phi(p,jjjjj,np-1,pg)*L.phi(q,jjjjjj,nq-1,qg)* L.phip(r,jjjjjjj,nr-1,rg))* (L.phi(x,i,nx-1,xg)*L.phi(y,ii,ny-1,yg)*L.phi(z,iii,nz-1,zg)* L.phi(t,iiii,nt-1,tg)*L.phi(p,iiiii,np-1,pg)*L.phi(q,iiiiii,nq-1,qg)* L.phi(r,iiiiiii,nr-1,rg)); } // end galk used by integration double galf(double x, double y, double z, double t, double p, double q, double r) // Galerkin f function for this problem { return Sf(x,y,z,t,p,q,r)*L.phi(x,i,nx-1,xg)*L.phi(y,ii,ny-1,yg)* L.phi(z,iii,nz-1,zg)*L.phi(t,iiii,nt-1,tg)* L.phi(p,iiiii,np-1,pg)*L.phi(q,iiiiii,nq-1,qg)* L.phi(r,iiiiiii,nr-1,rg); } // end galf used by integration void write_soln(double Usol[]) { String file_name = "boltzmann_7la.dat"; try { FileWriter fout = new FileWriter(file_name); BufferedWriter fileout = new BufferedWriter(fout); System.out.println("writing "+file_name); fileout.write("7 "+nx+" "+ny+" "+nz+" "+nt+ " "+np+" "+nq+" "+nr+" \n"); for(int i=0; i