/* curve ball - periodic express Morse 2D */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2005.04.02 */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class curveBallPEM2D extends Applet implements MouseListener, MouseMotionListener, ItemListener, AdjustmentListener, Runnable { /*-------------------------------------- define gloval -----*/ Choice ch_mat,ch_tcon,ch_view; Scrollbar sc_temp,sc_scale; Thread th = null; Dimension dim; Image imgOff; Graphics gOff; int sleepTime = 50; double sgm = 3.4e-10; /* L-J sigma for Ar (m) */ double dispScale = 6.0/sgm; double xMax = 300.0*sgm; /* x-Box size in (m) */ double yMax = 200.0*sgm; /* y-Box size in (m) */ int Nmt = 150*100+4000; /* number of molecules */ int NN = Nmt + 1; double t = 0.0; /* time (s) */ double dt = 5.0*1.0e-15; /* time division (s) */ int Nsx = 60; /* xMax/5.0 */ int Nsy = 40; /* yMax/5.0 */ int Ncx = 30; int Ncy = 20; int tempMode = 0; double contTemp = 300.0; double scale = 0.27; int dispMode = 5; int resetFlag = 0; int resetCount = 0; int dgX, dgY, dgXb, dgYb; double xShift = 0.0; double yShift = 0.0; double rc = 2.6*sgm; double rc2 = rc*rc; double AU = 1.661e-27; double EE = 1.602e-19; double AA = 1.0e-10; double Morse[][] = { /* mass charge D(eV) A(A^-1) r0(A) */ /* 0 W */ {183.85 *AU, 0.0*EE, 0.9906*EE, 1.4116/AA, 3.032*AA}, /* 1 Mo*/ { 95.94 *AU, 0.0*EE, 0.8032*EE, 1.5079/AA, 2.976*AA}, /* 2 Cr*/ { 51.996*AU, 0.0*EE, 0.4414*EE, 1.5721/AA, 2.754*AA}, /* 3 Fe*/ { 55.847*AU, 0.0*EE, 0.4174*EE, 1.3885/AA, 2.845*AA}, /* 4 Ni*/ { 58.71 *AU, 0.0*EE, 0.4205*EE, 1.4199/AA, 2.780*AA}, /* 5 Al*/ { 26.98 *AU, 0.0*EE, 0.2703*EE, 1.1646/AA, 3.253*AA}, /* 6 Pb*/ {207.19 *AU, 0.0*EE, 0.2348*EE, 1.1836/AA, 3.733*AA}, /* 7 Cu*/ { 63.54 *AU, 0.0*EE, 0.3429*EE, 1.3588/AA, 2.866*AA}, /* 8 Ag*/ {107.87 *AU, 0.0*EE, 0.3323*EE, 1.3690/AA, 3.115*AA}, /* 9 Ca*/ { 40.08 *AU, 0.0*EE, 0.1623*EE, 0.8054/AA, 4.569*AA}, /*10 Sr*/ { 87.62 *AU, 0.0*EE, 0.1513*EE, 0.7878/AA, 4.988*AA}, /*11 Ba*/ {137.34 *AU, 0.0*EE, 0.1416*EE, 0.6570/AA, 5.373*AA}, /*12 Na*/ { 22.99 *AU, 0.0*EE, 0.0633*EE, 0.5900/AA, 5.336*AA}, /*13 K */ { 39.102*AU, 0.0*EE, 0.0542*EE, 0.4977/AA, 6.369*AA}, /*14 Rb*/ { 85.47 *AU, 0.0*EE, 0.0464*EE, 0.4298/AA, 7.207*AA}, /*15 Cs*/ {132.905*AU, 0.0*EE, 0.0449*EE, 0.4157/AA, 7.557*AA}, /*16 Ne*/ { 20.183*AU, 0.0*EE, 0.0031*EE, 1.6500/AA, 3.076*AA}, /*17 Ar*/ { 39.948*AU, 0.0*EE, 0.0104*EE, 1.3400/AA, 3.816*AA}, /*18 Kr*/ { 83.80 *AU, 0.0*EE, 0.0141*EE, 1.2500/AA, 4.097*AA}, /*19 Xe*/ {131.30 *AU, 0.0*EE, 0.0200*EE, 1.2400/AA, 4.467*AA}, /*20 Hg*/ {200.59 *AU, 0.0*EE, 0.0734*EE, 1.4900/AA, 3.255*AA}, /*21 fixed*/ { 1.0e40, 0.0*EE, 0.0104*EE, 1.3400/AA, 3.816*AA} }; int NmatKind = 22; int MAT0 = 17; int MAT1 = 2; int MAT2 = 3; int MAT3 = 4; int MAT4 = 21; int kind[] = new int[NN]; /* i-th molec kind */ double xx[] = new double[NN]; /* i-th x-position */ double yy[] = new double[NN]; /* i-th y-position */ double vx[] = new double[NN]; /* i-th x-velocity */ double vy[] = new double[NN]; /* i-th y-velocity */ double ffx[] = new double[NN]; /* i-th x-force */ double ffy[] = new double[NN]; /* i-th y-force */ int reg[][] = new int[NN][200]; /* registration */ int section[][][] = new int[Nsx][Nsy][100]; int kindT[] = new int[NmatKind]; double forceTable[][][] = new double[5][5][10200]; double flowx[][] = new double[Ncx+1][Ncy+1]; double flowy[][] = new double[Ncx+1][Ncy+1]; double flown[][] = new double[Ncx+1][Ncy+1]; double flowt[][] = new double[Ncx+1][Ncy+1]; double meanFlowx[][] = new double[Ncx+1][Ncy+1]; double meanFlowy[][] = new double[Ncx+1][Ncy+1]; double meanFlown[][] = new double[Ncx+1][Ncy+1]; double meanFlowt[][] = new double[Ncx+1][Ncy+1]; double traceBallPos[][] = new double[127][2]; int traceCount = 0; double hh = 1.0e-13; /*----------------------------- applet control functions -----*/ public void init() { resize(630,400); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); ch_mat = new Choice(); ch_mat.addItem("W"); ch_mat.addItem("Mo"); ch_mat.addItem("Cr"); ch_mat.addItem("Fe"); ch_mat.addItem("Ni"); ch_mat.addItem("Al"); ch_mat.addItem("Pb"); ch_mat.addItem("Cu"); ch_mat.addItem("Ag"); ch_mat.addItem("Ca"); ch_mat.addItem("Sr"); ch_mat.addItem("Ba"); ch_mat.addItem("Na"); ch_mat.addItem("K"); ch_mat.addItem("Rb"); ch_mat.addItem("Cs"); ch_mat.addItem("Ne"); ch_mat.addItem("Ar"); ch_mat.addItem("Kr"); ch_mat.addItem("Xe"); ch_mat.addItem("Hg"); ch_mat.addItemListener(this); ch_tcon = new Choice(); ch_tcon.addItem("adiabatic"); ch_tcon.addItem("t scaling"); ch_tcon.addItemListener(this); ch_view = new Choice(); ch_view.addItem("ball"); ch_view.addItem("line"); ch_view.addItem("both"); ch_view.addItem("temp"); ch_view.addItem("dens"); ch_view.addItem("flow");ch_view.addItem("mean T"); ch_view.addItemListener(this); ch_view.select("flow"); sc_temp= new Scrollbar(Scrollbar.HORIZONTAL,30,10,1,210); sc_temp.addAdjustmentListener(this); sc_scale= new Scrollbar(Scrollbar.HORIZONTAL,27,10,20,210); 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(ch_tcon); pnl.add(ch_view); pnl.add(new Label(" ")); pnl.add(sc_temp); pnl.add(sc_scale); add(pnl,"North"); setInitialPosition(); } 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_mat) { MAT1 = ch_mat.getSelectedIndex(); t = 0.0; resetFlag = 1; resetCount = 2; } else if (ev.getSource() == ch_tcon) { tempMode = ch_tcon.getSelectedIndex(); } else if (ev.getSource() == ch_view) { dispMode = ch_view.getSelectedIndex(); } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == sc_temp) { contTemp = 10.0*(double)(sc_temp.getValue()); vAjustment(); } else if (ev.getSource() == sc_scale) { scale = 0.01*(double)(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; } xShift += (1.0/scale/dispScale)*(dgX-dgXb); yShift += (1.0/scale/dispScale)*(dgY-dgYb); } public void run() { while (th != null) { try { calcposition(); 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 i,ix,iy; int gball,gbx,gby,gb; double sc,sz,tmp; gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); setFlow(); sc = scale*dispScale; sz = 0.8*scale*dispScale; gbx = 30+(int)(sc*xShift); gby = 65+(int)(sc*yShift); gball = (int)(6.0*scale); tmp = temperature(); if (dispMode==0) { dispBalls(gbx,gby); } else if (dispMode==1) { dispLines(gbx,gby); } else if (dispMode==2) { dispLinesAndBalls(gbx,gby); } else if (dispMode==3) { dispTempBalls(gbx,gby); } else if (dispMode==4) { dispDensity(gbx,gby); } else if (dispMode==5) { dispFlow(gbx,gby); } else if (dispMode==6) { dispMeanTemp(gbx,gby); } gOff.setColor(Color.gray); ix = (int)(sc*xMax); iy = (int)(sc*yMax); gOff.fillRect(gbx-gball/2,gby-gball/2,gball,iy+gball); gOff.fillRect(gbx-gball/2,gby-gball/2,ix+gball,gball); gOff.fillRect(gbx+ix-gball/2+1,gby-gball/2,gball,iy+gball); gOff.fillRect(gbx-gball/2,gby+iy-gball/2+1,ix+gball,gball); gOff.drawLine(gbx-gball/2,gby+iy/2, gbx+ix-gball/2,gby+iy/2); gOff.drawLine(gbx+ix/3,gby-gball/2, gbx+ix/3,gby+iy+gball/2); gOff.setColor(Color.black); for (i=0; i<100; i++) { ix = gbx+(int)(sc*traceBallPos[i][0]); iy = gby+(int)(sc*traceBallPos[i][1]); gOff.fillOval(ix-3,iy-3, 6, 6); } gbx = dim.width/6; gOff.setColor(Color.black); gOff.drawString("temp control",gbx*1+10,40); gOff.drawString("view",gbx*2+10,40); gOff.drawString("cont T="+contTemp+"K",gbx*4+10,40); gOff.drawString("scale="+(int)(scale*100.0+0.499)+"%",gbx*5+10,40); gOff.setColor(Color.blue); gOff.drawString("t="+(int)(t*1.0e13+0.5)/10.0+" ps",gbx*3+10,40); gOff.drawString("T="+(int)(tmp*10+0.5)/10.0+" K",gbx*4+10,60); gOff.drawString("L="+(int)(xMax*1.0e10+0.5)/10.0+" nm",gbx*5+10,60); gOff.drawString("ball position",530,100); gOff.drawString("X="+(int)(ballPosX()*1.0e11+0.5)/100.0+" nm",530,120); gOff.drawString("Y="+(int)(ballPosY()*1.0e11+0.5)/100.0+" nm",530,140); } int regMax() { int i,m; m = 0; for(i=0;im) { m = reg[i][0]; } } return(m); } /*--------------------------------- display methods ----------*/ void dispBalls(int gx, int gy) { int i,ir,ix,iy; double sc,sz; sc = scale*dispScale; sz = 0.8*scale*dispScale; for (i=0; ii) { ix2 = (int)(sc*xx[j])+gx; iy2 = (int)(sc*yy[j])+gy; gOff.setColor(Color.gray); gOff.drawLine(ix,iy, ix2,iy2); } } } } void dispLinesAndBalls(int gx, int gy) { int i,j,k,ir,ix,iy,ix2,iy2; double sc,sz,r2; sc = scale*dispScale; sz = 0.8*scale*dispScale; for (i=0; ii) { ix2 = (int)(sc*xx[j])+gx; iy2 = (int)(sc*yy[j])+gy; gOff.setColor(Color.gray); gOff.drawLine(ix,iy, ix2,iy2); } } gOff.setColor(Color.getHSBColor((float)(colorOf(i)),0.95f,0.95f)); gOff.fillOval(ix-ir/2,iy-ir/2, ir, ir); } } void dispTempBalls(int gx, int gy) { int i,ir,ix,iy; double sc,sz,tm; sc = scale*dispScale; sz = 0.8*scale*dispScale; for (i=0; i0.7) tm = 0.7; gOff.setColor(Color.getHSBColor((float)(colorOf(i)),0.95f,(float)(tm+0.29))); gOff.fillOval(ix-ir/2,iy-ir/2, ir, ir); } } void dispDensity(int gx, int gy) { int i,j,ix,iy; double sc,sz,dn; sc = scale*dispScale; sz = 0.8*scale*dispScale; for (i=0; i0.99) dn = 0.99; gOff.setColor(Color.getHSBColor(0.33f,(float)dn,0.9f)); gOff.fillRect(ix,iy,(int)(sc*xMax/Ncx)+1,(int)(sc*yMax/Ncy)+1); } } setBalls(gx,gy); } void dispFlow(int gx, int gy) { int i,j,ix,iy,ix2,iy2; double sc,sz; sc = scale*dispScale; sz = 0.8*scale*dispScale; for (i=0; i0) { gOff.setColor(Color.blue); } else { gOff.setColor(Color.red); } gOff.drawLine(ix,iy, ix2,iy2); } } setBalls(gx,gy); } void dispMeanTemp(int gx, int gy) { int i,j,ix,iy; double sc,sz,tm; sc = scale*dispScale; sz = 0.8*scale*dispScale; for (i=0; i0.0) tm = flowt[i][j]/flown[i][j]/3000.0; if (tm>0.66) tm = 0.66; gOff.setColor(Color.getHSBColor((float)(0.67-tm),0.8f,0.8f)); gOff.fillRect(ix,iy,(int)(sc*xMax/Ncx)+1,(int)(sc*yMax/Ncy)+1); } } setBalls(gx,gy); } void setBalls(int gx, int gy) { int i, ir,ix,iy; double sc,sz; sc = scale*dispScale; sz = 0.8*scale*dispScale; for (i=0; i=1; i--) { traceBallPos[i][0] = traceBallPos[i-1][0]; traceBallPos[i][1] = traceBallPos[i-1][1]; } traceBallPos[0][0] = posx; traceBallPos[0][1] = posy; } /*------------------------------------- v ajustment ---------*/ void vAjustment() { int i; double tmp, r; tmp = temperature(); r = Math.sqrt(contTemp/tmp); for (i=0; i=0.8*rc && rx0-r0 && xy0-r0 && yip) { xij = xx[ip] - xx[jp]; yij = yy[ip] - yy[jp]; if (xij>0.5*xMax) xij -= xMax; if (xij<-0.5*xMax) xij += xMax; if (yij>0.5*yMax) yij -= yMax; if (yij<-0.5*yMax) yij += yMax; r2=xij*xij+yij*yij; if (r2=Nsx) i = Nsx-1; j = (int)(Nsy*yy[ip]/yMax); if (j>=Nsy) j = Nsy-1; iq = section[i][j][0]+1; section[i][j][0] = iq; section[i][j][iq] = ip; } } /*------------------------------- molecules motion ---------*/ void calcposition(){ int i; if (tempMode==1) { vAjustment(); } if (resetFlag==1) { setInitialPosition(); resetCount -= 1; if (resetCount<=0) resetFlag = 0; } traceCount += 1; if (traceCount>=100) { traceCount = 0; traceBall(ballPosX(), ballPosY()); } registration(); for (i=0; i<20; i++) { timeEvolution(); } } void timeEvolution(){ int i; double dtv2, a2, rr, tmp; dtv2 = dt/2.0; t = t + dt; rr = 1.0; if (tempMode==2) { tmp = temperature(); rr = Math.sqrt(contTemp/tmp); if (rr<0.5) { rr = 0.5; } else if (rr>1.2){ rr=1.2; }; } for (i=0; i xMax) { xx[i] -= xMax; } if (yy[i] < 0.0) { yy[i] += yMax; } if (yy[i] > yMax) { yy[i] -= yMax; } } } void forceCalc() { int i,j,k; double xij,yij; double r2,rij,f,fxij,fyij; for(i=0;i0.5*xMax) xij -= xMax; if (xij<-0.5*xMax) xij += xMax; if (yij>0.5*yMax) yij -= yMax; if (yij<-0.5*yMax) yij += yMax; r2=xij*xij+yij*yij; if (r2