/* template QM2D */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2004.05.08 */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class templateQM2D extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { /* -------------------------------------- set global ------ */ Choice cvw; Button bt_reset, bt_start, bt_stop; Scrollbar spx,spy; Thread th = null; Dimension dim; Image imgOff; Graphics gOff; int sleepTime = 30; int dispMode = 0; int started = 1; double px0 = 24.0; double py0 = 8.0; int dgX, dgY, dgXb,dgYb; 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); double t = 0.0; double dx = 8.0/256.0; double dy = 8.0/256.0; double dt = 0.5*dx*dx; double epsilonX = dt/(dx*dx); double alphaXRe = 0.5 * (1.0+Math.cos(epsilonX/2)); double alphaXIm = -0.5 * Math.sin(epsilonX/2); double betaXRe = Math.sin(epsilonX/4)*Math.sin(epsilonX/4); double betaXIm = 0.5 * Math.sin(epsilonX/2); double epsilonY = dt/(dy*dy); double alphaYRe = 0.5 * (1.0+Math.cos(epsilonY/2)); double alphaYIm = -0.5 * Math.sin(epsilonY/2); double betaYRe = Math.sin(epsilonY/4)*Math.sin(epsilonY/4); double betaYIm = 0.5 * Math.sin(epsilonY/2); int NNx = 256; int NNy = 256; int NN = NNx+1; /* max(NNx,NNy)+1 */ int NNr = 200; double phRe[][] = new double[NNx][NNy]; double phIm[][] = new double[NNx][NNy]; double vv[][] = new double[NNx][NNy]; int xpts[] = new int[NN]; int ypts[] = new int[NN]; double icol[] = new double[NN]; double srh[] = new double[NNr+1]; int xptr[] = new int[NNr+1]; int yptr[] = new int[NNr+1]; /* ----------------------------- applet control ------ */ public void init() { resize(630,320); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); cvw = new Choice(); cvw.addItem("density"); cvw.addItem("grid ph"); cvw.addItem("grid V"); cvw.addItem("grid ph+V"); cvw.addItem("phase"); cvw.addItem("cloud"); cvw.addItemListener(this); bt_reset= new Button("reset"); bt_reset.addActionListener(this); bt_start= new Button("start"); bt_start.addActionListener(this); bt_stop = new Button("stop"); bt_stop.addActionListener(this); spx= new Scrollbar(Scrollbar.HORIZONTAL,240,10,0,310); spx.addAdjustmentListener(this); spy= new Scrollbar(Scrollbar.HORIZONTAL,80,10,0,310); spy.addAdjustmentListener(this); addMouseListener(this); addMouseMotionListener(this); setLayout(new BorderLayout()); Panel pnl = new Panel(); pnl.setLayout(new GridLayout(1,6,5,0)); pnl.add(bt_reset); pnl.add(bt_start); pnl.add(bt_stop); pnl.add(cvw); pnl.add(spx); pnl.add(spy); 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() == cvw){ dispMode = cvw.getSelectedIndex(); } } public void actionPerformed(ActionEvent ev){ if(ev.getSource() == bt_reset){ t = 0.0; setInitialCondition(); started = 0; } else if(ev.getSource() == bt_start){ started = 1; } else if(ev.getSource() == bt_stop){ started = 0; } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == spx) { px0 = 0.1*(double)(spx.getValue()); } else if (ev.getSource() == spy) { py0 = 0.1*(double)(spy.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; } 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() { double ev,ek; ev = meanPotential(); ek = meanKinetic(); gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); if (dispMode==0) { densityPlot(2.0); } else if (dispMode==1) { gridPlot(50.0, 0.0); } else if (dispMode==2) { gridPlot(0.0, 0.1); } else if (dispMode==3) { gridPlot(50.0, 0.1); } else if (dispMode==4) { phasePlot(4.0); } else if (dispMode==5) { cloudPlot(); } gOff.setColor(Color.black); gOff.drawString("view",630/6*3+10,40); gOff.drawString("px0="+(int)(px0*10.0+0.5)/10.0+" au",630/6*4+10,40); gOff.drawString("py0="+(int)(py0*10.0+0.5)/10.0+" au",630/6*5+10,40); gOff.drawString("Lx="+(int)(NNx*dx*52.918+0.5)+" pm",630/6*4+10,60); gOff.drawString("Ly="+(int)(NNy*dy*52.918+0.5)+" pm",630/6*5+10,60); gOff.setColor(Color.blue); gOff.drawString("t="+(int)(t*2418.9+0.5)/100.0+" as",10,40); gOff.drawString("norm="+norm()+" ",630/6*1+10,40); gOff.drawString("V="+(int)(ev*100+0.5)/100.0+" ",630/6*0+10,55); gOff.drawString("K="+(int)(ek*100+0.5)/100.0+" ",630/6*1+10,55); gOff.drawString("K+V="+(int)((ev+ek)*100+0.5)/100.0+" ",630/6*2+10,55); } /*------------------------------ plot methods ----------------*/ void densityPlot(double weight) { int i,j,gbx,gby,mag; double ph2; gbx = 30; gby = 60; mag = 1; gOff.setColor(Color.black); gOff.fillRect(gbx-1,gby-1,mag*NNx+1,mag*NNy+1); for (i=0; i0.9) { ph2 = 0.9; } if (ph2>0.02) { gOff.setColor(Color.getHSBColor(0.15f, 0.95f, (float)(ph2+0.1))); gOff.fillRect(gbx+mag*i,gby+mag*j, mag, mag); } else if (vv[i][j]>0.0) { gOff.setColor(Color.getHSBColor(0.33f, 0.95f, 0.6f)); gOff.fillRect(gbx+mag*i,gby+mag*j, mag, mag); } } } } void gridPlot(double phWeight, double vvWeight) { int i,j,gbx,gby; int cx,cy,cz; double z,px,py,pz,sc; double ph2,v; cx = NNx/2; cy = NNy/2; cz = 0; sc = 2.0; gbx = 0+(int)(cx/sc); gby = -100+(int)(cy/sc); for(j=0; j300.0) { v = 300; } z = phWeight*ph2 + vvWeight*v + cz; py = cosFi*(j-cy)+sinFi*(z-cz) + cy; pz = -sinFi*(j-cy)+cosFi*(z-cz) + cz; px = cosTh*(i-cx)+sinTh*(pz-cz) + cx; pz = -sinTh*(i-cx)+cosTh*(pz-cz) + cz; xpts[i] = (int)(sc*px)+gbx; ypts[i] = (int)(sc*py)+gby; if (ph2>0.02) { icol[i] = 0.15; } else if (vv[i][j]>0.0) { icol[i] = 0.33; } else { icol[i] = 0.66; } } for (i=0; i300.0) { v = 300; } z = phWeight*ph2 + vvWeight*v + cz; py = cosFi*(j-cy)+sinFi*(z-cz) + cy; pz = -sinFi*(j-cy)+cosFi*(z-cz) + cz; px = cosTh*(i-cx)+sinTh*(pz-cz) + cx; pz = -sinTh*(i-cx)+cosTh*(pz-cz) + cz; xpts[j] = (int)(sc*px)+gbx; ypts[j] = (int)(sc*py)+gby; if (ph2>0.02) { icol[j] = 0.15; } else if (vv[i][j]>0.0) { icol[j] = 0.33; } else { icol[j] = 0.66; } } for (j=0; j0.9) { ph2 = 0.9; } if (ph2>0.01) { r = Math.sqrt(ph2/weight); gOff.setColor(Color.getHSBColor((float)(0.5+0.5*phRe[i][j]/r), 0.9f, (float)(ph2+0.1))); gOff.fillRect(gbx+mag*i,gby+mag*j, mag, mag); } else if (vv[i][j]>0.0) { gOff.setColor(Color.getHSBColor(0.33f, 0.95f, 0.6f)); gOff.fillRect(gbx+mag*i,gby+mag*j, mag, mag); } } } } void cloudPlot() { int i,j,m,gbx,gby,mag; double ph2,r; setsrh(); gbx = 30; gby = 60; mag = 1; gOff.setColor(Color.black); gOff.fillRect(gbx-1,gby-1,mag*NNx+1,mag*NNy+1); for (i=0; i0.0) { gOff.setColor(Color.getHSBColor(0.33f, 0.95f, 0.6f)); gOff.fillRect(gbx+mag*i,gby+mag*j, mag, mag); } } } for (m=0; msrh[j+1]) { s = srh[j+1]; srh[j+1] = srh[j]; srh[j] = s; } } } m = 0; s = 0.0; for (i=0;isrh[m] && mwallPos && x<(wallPos+wallWidth)) { vv[i][j] = wallHight; } else { vv[i][j] = 0.0; } } } for (i=0;i