/* * large - real-coded lattice gas model 2D * * coded by Ikeuchi Mitsuru * ver 0.0.1 2006.03.12 created * ver 0.0.2 2006.03.18 change view menu * */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class largeRLG2D extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { /* -------------------------------------- set global ------ */ Button bt_reset, bt_startStop; Choice ch_view; Scrollbar sc_scale; Thread th = null; Dimension dim; Image imgOff; Graphics gOff; int sleepTime = 50; double t = 0.0; double dt = 1.0; double dx = 1.0; double dy = 1.0; int Nsx = 640; int Nsy = 400; double xMax = Nsx*dx; double yMax = Nsy*dy; int NinCell = 4; int dispMode = 2; int resetSW = 0; int started = 1; int incRate = 1; double gravity = 0.0; double dispScale = (300.0/yMax); double viewScale = 1.0; int dragSW = 1; int dgX, dgY, dgXb, dgYb; double xShift = 0.0; double yShift = 0.0; double viewTheta = -15.0*3.14/180.0; double viewFai = -72.0*3.14/180.0; double dtheta = 0.0*3.14/180.0; double pai = 3.1415926536; double cosTh = Math.cos(viewTheta); double sinTh = Math.sin(viewTheta); double cosFi = Math.cos(viewFai); double sinFi = Math.sin(viewFai); int NNp = Nsx*Nsy*NinCell; double xx[] = new double [NNp]; double yy[] = new double [NNp]; double vx[] = new double [NNp]; double vy[] = new double [NNp]; int NNs = 20; int section[][][] = new int [Nsx][Nsy][NNs]; int cellAttribute[][] = new int [Nsx][Nsy]; double refTemp[] = { 0.0, 0.0, 0.0, 0.0 }; int vDistribution[][] = new int [200][3]; /* ----------------------------- applet control ------ */ public void init() { resize(630,420); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); bt_reset= new Button("reset"); bt_reset.addActionListener(this); bt_startStop= new Button("start/stop"); bt_startStop.addActionListener(this); ch_view = new Choice(); ch_view.addItem("sample 8k"); ch_view.addItem("velocity 8k"); ch_view.addItem("density"); ch_view.addItem("flow"); ch_view.addItem("temperature"); ch_view.addItem("pressure"); ch_view.addItem("v space"); ch_view.addItem("v distr."); ch_view.addItemListener(this); ch_view.select("density"); sc_scale= new Scrollbar(Scrollbar.HORIZONTAL,100,10,50,510); sc_scale.addAdjustmentListener(this); addMouseListener(this); addMouseMotionListener(this); setLayout(new BorderLayout()); Panel pnl = new Panel(); pnl.setLayout(new GridLayout(1,6,5,0)); /* pnl.add(new Label(" ")); */ pnl.add(bt_reset); pnl.add(bt_startStop); pnl.add(new Label(" ")); pnl.add(new Label(" ")); pnl.add(sc_scale); pnl.add(ch_view); add(pnl,"North"); setInitialCondition(); } public void start() { if (th == null) { th = new Thread(this); th.start(); } } public void stop() { if (th != null) { th.stop(); th = null; } } public void itemStateChanged(ItemEvent ev){ if (ev.getSource() == ch_view) { dispMode = ch_view.getSelectedIndex(); } } public void actionPerformed(ActionEvent ev){ if(ev.getSource() == bt_reset){ resetSW = 1; } else if (ev.getSource() == bt_startStop){ if (started==0) { started = 1; } else { started = 0; } } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == sc_scale) { viewScale = 0.01*sc_scale.getValue(); } } public void mousePressed(MouseEvent ev){ } public void mouseReleased(MouseEvent ev){ dgXb = 0; dgYb = 0; dgX = 0; dgY = 0; } public void mouseClicked(MouseEvent ev){ } public void mouseEntered(MouseEvent ev){ } public void mouseExited (MouseEvent ev){ } public void mouseMoved (MouseEvent ev){ } public void mouseDragged(MouseEvent ev){ dgXb = dgX; dgYb = dgY; dgX=ev.getX(); dgY=ev.getY(); if (dgXb==0 && dgYb==0) { dgXb = dgX; dgYb = dgY; } if (dragSW==1) { xShift += (1.0/viewScale/dispScale)*(dgX-dgXb); yShift += (1.0/viewScale/dispScale)*(dgY-dgYb); } else if (dragSW==2) { viewTheta += 0.5*3.14/180.0*(dgX-dgXb); viewFai += 0.5*3.14/180.0*(dgY-dgYb); cosTh = Math.cos(viewTheta); sinTh = Math.sin(viewTheta); cosFi = Math.cos(viewFai); sinFi = Math.sin(viewFai); } } public void run() { while (th != null) { try { timeEvolution(); offPaint(); repaint(); Thread.sleep(sleepTime); } catch (InterruptedException e) { } } } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { g.drawImage(imgOff,0,0,this); } /* ----------------------------- offPaint -------------------- */ void offPaint() { int gbx, gby; double sc,temp; gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); sc = viewScale*dispScale; gbx = 30+(int)(sc*xShift); gby = 80+(int)(sc*yShift); if (dispMode==0) { dragSW = 1; ovalPlot(gbx,gby,sc,8000); } else if (dispMode==1) { dragSW = 1; velosityPlot(gbx,gby,sc, 8000, 10.0); } else if (dispMode==2) { dragSW = 1; meanDensityPlot(gbx,gby,sc, 4, 0.5/NinCell); } else if (dispMode==3) { dragSW = 1; meanFlowPlot(gbx,gby,sc, 4, 20.0); } else if (dispMode==4) { dragSW = 1; meanTemperaturePlot(gbx,gby,sc, 4, 1.5); } else if (dispMode==5) { dragSW = 1; meanPressurePlot(gbx,gby,sc, 4, 1.5/NinCell); } else if (dispMode==6) { dragSW = 1; vSpacePlot(30,80,8000); } else if (dispMode==7) { velocityDistributionPlot(80,100,0.005); } else if (dispMode==8) { ; } gOff.setColor(Color.black); gOff.drawString("t="+(int)(t*10.0+0.5)/10.0+" ",630/6*0+10,40); if (started==1) { gOff.drawString("started",630/6*1+10,40); } else { gOff.drawString("stopped",630/6*1+10,40); } gOff.drawString("scale="+(int)(viewScale*100.0+0.5)/100.0+" ",630/6*4+10,40); gOff.drawString("view",630/6*5+10,40); gOff.setColor(Color.blue); temp = systemTemperature(); gOff.drawString("Box="+Nsx+"x"+Nsy+"",630/6*0+10,60); gOff.drawString("N="+NNp+"",630/6*1+10,60); gOff.drawString("T="+(int)(temp*1000.0+0.5)/1000.0+"",630/6*2+10,60); gOff.drawString("nue="+(int)(viscosityMin(temp)*1000.0+0.5)/1000.0+" ",630/6*3+10,60); gOff.drawString("maxNc="+maxSection()+" ",630/6*5+10,60); //gOff.drawString("total K="+(float)(totalKineticEnergy())+" ",410,80); } /*------------------------- plot methods -------------------*/ void ovalPlot(int gx, int gy, double sc,int Nsample) { int i,ir,ix,iy; drawWaku(gx,gy,sc); drawBlock(gx,gy,sc); ir = (int)(2*sc+0.5); for (i=0; i0.0) { gOff.setColor(Color.getHSBColor(0.6f,0.9f,0.7f)); } else { gOff.setColor(Color.getHSBColor(0.01f,0.9f,0.7f)); } gOff.drawLine(ix,iy,ix2,iy2); } } void meanFlowPlot(int gx, int gy, double sc, int Ncoarse, double mag) { int ic,jc,i,j,ip,k,n,nn,ix,iy,ix2,iy2; double mvx, mvy, rho, den; drawWaku(gx,gy,sc); drawBlock(gx,gy,sc); for (ic=0; ic0.9) den = 0.9; ix = gx + (int)((ic+Ncoarse/2)*sc); iy = gy + (int)((jc+Ncoarse/2)*sc); ix2 = ix+(int)(mvx*dt*sc*mag+0.5); iy2 = iy+(int)(mvy*dt*sc*mag+0.5); if (mvx>=0.0) { gOff.setColor(Color.getHSBColor(0.6f,(float)den,0.7f)); } else { gOff.setColor(Color.getHSBColor(0.01f,(float)den,0.7f)); } gOff.drawLine(ix,iy,ix2,iy2); } } } void meanDensityPlot(int gx, int gy, double sc, int Ncoarse, double mag) { int ic,jc,i,j,ip,k,n,nn,ix,iy,ir; double d; ir = (int)(Ncoarse*sc+0.999); for (ic=0; ic0.99) d = 0.99; ix = gx + (int)(ic*sc); iy = gy + (int)(jc*sc); gOff.setColor(Color.getHSBColor(0.3f,0.9f,(float)d)); gOff.fillRect(ix,iy,ir,ir); } } drawWaku(gx,gy,sc); drawBlock(gx,gy,sc); } void meanTemperaturePlot(int gx, int gy, double sc, int Ncoarse, double mag) { int ic,jc,i,j,ip,k,n,nn,ix,iy,ir; double mvx,mvy,ke,d,den,rho; ir = (int)(Ncoarse*sc+0.999); for (ic=0; ic0.9) den = 0.9; ke = 0.0; for (i=ic; i0.99) d = 0.99; ix = gx + (int)(ic*sc); iy = gy + (int)(jc*sc); gOff.setColor(Color.getHSBColor((float)(0.6-0.6*d),(float)den,0.9f)); gOff.fillRect(ix,iy,ir,ir); } } drawWaku(gx,gy,sc); drawBlock(gx,gy,sc); } void meanPressurePlot(int gx, int gy, double sc, int Ncoarse, double mag) { int ic,jc,i,j,ip,k,n,nn,ix,iy,ir; double mvx,mvy,ke,rho,d,den; ir = (int)(Ncoarse*sc+0.999); for (ic=0; ic0.9) den = 0.9; ke = 0.0; for (i=ic; i0.99) d = 0.99; ix = gx + (int)(ic*sc); iy = gy + (int)(jc*sc); gOff.setColor(Color.getHSBColor((float)(0.6-0.6*d),(float)den,0.9f)); gOff.fillRect(ix,iy,ir,ir); } } drawWaku(gx,gy,sc); drawBlock(gx,gy,sc); } void drawBlock(int gx, int gy, double sc) { int ix,iy,iss,ca; double ss; ss = sc*xMax/(double)Nsx; iss = (int)(ss+0.999); for (ix=0; ix0) { if (refTemp[ca]>0.0) { gOff.setColor(Color.getHSBColor(0.85f,0.9f,(float)(0.2+0.8*refTemp[ca]))); } else { gOff.setColor(Color.getHSBColor(0.85f,0.3f,0.9f)); } gOff.fillRect(gx+(int)(ss*ix+0.5),gy+(int)(ss*iy+0.5), iss, iss); } } } } void drawWaku(int gx, int gy, double sc) { gOff.setColor(Color.black); gOff.drawRect(gx,gy,(int)(sc*xMax+0.5),(int)(sc*yMax+0.5)); } /* ---- velocity space plot ---- */ void vSpacePlot(int gx, int gy, int Nsample) { int i,ix,iy,bx,by; double mag; mag = 50.0; bx = (int)(3.0*mag)+gx; by = (int)(3.0*mag)+gy; for (i=0; i0) { gOff.setColor(Color.lightGray); gOff.drawLine(gx+i,gy+hoganHight,gx+i,gy+hoganHight-n1); } } drawHogan(gx,gy,hoganWidth,hoganHight,xDiv,yDiv); gOff.setColor(Color.black); gOff.drawString("0",gx-5,gy+hoganHight+15); gOff.drawString("2",gx+hoganWidth/2-5,gy+hoganHight+15); gOff.drawString("4",gx+hoganWidth-5,gy+hoganHight+15); gOff.drawString("velocity distribution",gx+20,gy+hoganHight+35); } void setVelocityDistribution() { int i,iv; double v; for(i=0;i<200;i++) { vDistribution[i][0] = 0; } for(i=0;i=Nsx-Nsx/5 && ic<=Nsx-Nsx/5+3 && jc0) { xx[i] -= vx[i]*dt; yy[i] -= vy[i]*dt; r = 1.0; if (refTemp[ca]>0.0) { temp = 0.5*(vx[i]*vx[i]+vy[i]*vy[i]); r = Math.sqrt(refTemp[ca]/temp)*(1.0-1.0*(Math.random()-0.5)); } else { r = 1.0; } vx[i] = -r*vx[i]; vy[i] = -r*vy[i]; } } rr = 1.0; for (i=0; i xMax) { xx[i] = xMax; vx[i] = -rr*vx[i]; vy[i] = rr*vy[i]; } if (yy[i] < 0.0) { yy[i] = 0.0; vx[i] = rr*vx[i]; vy[i] = -rr*vy[i]; } if (yy[i] > yMax) { yy[i] = yMax; vx[i] = rr*vx[i]; vy[i] = -rr*vy[i]; } } } int cellAttributeAt(double x, double y) { int ix,iy; ix = (int)(x/dx); if (ix>=Nsx) ix = Nsx-1; if (ix<0) ix = 0; iy = (int)(y/dy); if (iy>=Nsy) iy = Nsy-1; if (iy<0) iy = 0; return( cellAttribute[ix][iy] ); } void collision() { int ic,jc,nn,ip,k; dividingSection(); for(ic=0;ic1) { if (cellAttribute[ic][jc]==0) { collisionInTheCell(ic,jc); } } } } } void collisionInTheCell(int ic, int jc) { int i,k,n; double cTh,sTh,vxm,vym,vxs,vys; cTh = 0.0; sTh = 1.0; if (Math.random()<0.5) { cTh = 0.0; sTh = -1.0; } n = section[ic][jc][0]; vxm = 0.0; vym = 0.0; for(i=1;i<=n;i++) { k = section[ic][jc][i]; vxm += vx[k]; vym += vy[k]; } vxm = vxm/n; vym = vym/n; for(i=1;i<=n;i++) { k = section[ic][jc][i]; vxs = vx[k]-vxm; vys = vy[k]-vym; vx[k] = vxm +cTh*vxs +sTh*vys; vy[k] = vym -sTh*vxs +cTh*vys; } } /*----- dividing section -----*/ void dividingSection() { int i,j,ip,iq; for(i=0;i=Nsx) i = Nsx-1; j = (int)(Nsy*yy[ip]/yMax); if (j>=Nsy) j = Nsy-1; iq = section[i][j][0]+1; if (iqm) m = section[i][j][0]; } } return ( m ); } /* ----------------------------- end of applet -------------- */ } /* real-coded lattice gas model 2D * * method * * (1) movement * r = r + v*dt * * (2) collision - all particles collide each other in the same cell * vm = mean v in the cell * vi = vm + rotate(theta)(vi0-vm), (theta = +-pai/2 : minmum viscosity) * */