/* rocket - faster Morse MD */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2003.06.30 */ /* ver 0.0.2 2004.03.14 improved pannel layout */ /* ver 0.0.3 2004.03.20 improved layout */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class rocketFM extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { /*-------------------------------------- define gloval -----*/ Button bt_reset, bt_start, bt_stop; Choice cvw; Scrollbar scv,scs; 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 = 10.0/sgm; double xMax = 25.0*sgm; /* x-Box size in (m) */ double yMax = 25.0*sgm; /* y-Box size in (m) */ double zMax = 25.0*sgm; /* z-Box size in (m) */ int Nmt = 40*30; /* number of molecules */ int NN = Nmt + 1; double t = 0.0; /* time (s) */ double dt = 5.0*1.0e-15; /* time division (s) */ int started = 1; int count = 0; int tempMode = 0; double contTemp = 4000.0; double scale = 0.60; int dispMode = 0; int dgX, dgY, dgXb, dgYb; double xShift = 0.0; double yShift = 0.0; double rc = 1.0e-9; double rc2 = rc*rc; double rreg = 1.5e-9; double rreg2 = rreg*rreg; 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 bld*/{ 39.948*AU, 0.0*EE, 0.0104*EE, 1.3400/AA, 3.816*AA}, /*22 fix*/{ 1.0 , 0.0*EE, 0.0104*EE, 1.3400/AA, 3.816*AA} }; int NmatKind = 23; int MAT0 = 17; int MAT1 = 0; int MAT2 = 4; int MAT3 = 9; int MAT4 = 3; int MAT5 = 21; /* do not change */ 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 */ double fbx[] = new double[NN]; /* i-th x-force before dt */ double fby[] = new double[NN]; /* i-th y-force before dt */ int reg[][] = new int[NN][100]; /* registration */ int kindT[] = new int[NmatKind]; double forceTable[][][] = new double[6][6][10200]; double hh = 1.0e-13; /*----------------------------- applet control functions -----*/ 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("ball"); cvw.addItem("line"); cvw.addItem("both"); cvw.addItem("temp"); 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); scv= new Scrollbar(Scrollbar.HORIZONTAL,40,10,10,160); scv.addAdjustmentListener(this); scs= new Scrollbar(Scrollbar.HORIZONTAL,60,10,20,210); scs.addAdjustmentListener(this); addMouseListener(this); addMouseMotionListener(this); setLayout(new BorderLayout()); Panel pnl = new Panel(); pnl.setLayout(new GridLayout(1,6,5,0)); pnl.add(cvw); pnl.add(bt_reset); pnl.add(bt_start); pnl.add(bt_stop); pnl.add(scv); pnl.add(scs); add(pnl,"North"); setInitialPosition(); repaint(); } 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; started = 1; count = 0; setInitialPosition(); } else if(ev.getSource() == bt_start){ if (started==1 && count==0) { started = 1; count += 1; excite(); } else if (started==0) { started = 1; } } else if(ev.getSource() == bt_stop){ started = 0; } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == scv) { contTemp = 100.0*(double)(scv.getValue()); } else if (ev.getSource() == scs) { scale = 0.01*(double)(scs.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,ir,j,k,ix2,iy2; int gball,gbx,gby,gb; double sc,sz,tmp,tm,r2; gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); gball = 5; sc = scale*dispScale; gbx = 80+(int)(sc*xShift); gby = 100+(int)(sc*yShift); sz = 0.85*scale*dispScale; gOff.setColor(Color.gray); iy = (int)(sc*30*sgm); gOff.drawRect(gbx-gball-5,gby-gball,5,iy+2*gball); if (dispMode==0) { for (i=0; ii) { ix2 = (int)(sc*xx[j])+gbx; iy2 = (int)(sc*yy[j])+gby; gOff.setColor(Color.gray); gOff.drawLine(ix,iy, ix2,iy2); } } } } else if (dispMode==2) { for (i=0; ii) { ix2 = (int)(sc*xx[j])+gbx; iy2 = (int)(sc*yy[j])+gby; 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); } } else if (dispMode==3) { for (i=0; i0.99) { tm = 0.99; } gOff.setColor(Color.getHSBColor((float)(colorOf(i)),0.95f,(float)(tm))); gOff.fillOval(ix-ir/2,iy-ir/2, ir, ir); } } gOff.setColor(Color.black); gOff.drawString("view",630/6*0+10,40); gOff.drawString("T fuel="+contTemp+"K",630/6*4+10,40); gOff.drawString("scale="+(int)(scale*100.0+0.499)+"%",630/6*5+10,40); gOff.setColor(Color.blue); gOff.drawString("t="+(int)(t*1.0e13+0.5)/10.0+" ps",630/6*3+10,40); gOff.drawString("T rocket="+(int)(rocketTemp()+0.5)+" K",630/6*4+10,60); gOff.drawString("speed="+(int)(xspeed()*10.0+0.5)/10.0+" m/s",630/6*5+10,60); } double colorOf(int i) { double col; col = 0.0; if (kind[i]==MAT0) { col = 0.01; } else if (kind[i]==MAT5) { col = 0.33; } else if (kind[i]==MAT2) { col = 0.15; } else if (kind[i]==MAT3) { col = 0.50; } else if (kind[i]==MAT4) { col = 0.66; } else if (kind[i]==MAT1) { col = 0.85; } return ( col ); } /*------------------------------------- statictics ----------*/ double rmsV() { int i; double s; s = 0.0; for (i=0; i=6000 && ir<10000) { rt = 0.5+0.5*Math.cos(3.1415926536*(((double)ir)/10000.0-0.6)/0.4); } else { rt = 0.0; } return( rt ); } /*------------------------------- set initial position ---------*/ void setInitialPosition(){ int i,ix,iy; double a,yd,x0,y0; kindT[MAT0] = 0; kindT[MAT1] = 1; kindT[MAT2] = 2; kindT[MAT3] = 3; kindT[MAT4] = 4; kindT[MAT5] = 5; setForceTable(); a = Morse[MAT0][4]*1.0; x0 = 0.0*sgm; y0 = 0.0*sgm; i = 0; for (ix=0; ix<40; ix++) { for (iy=0; iy<30; iy++) { if (ix<30 && iy>5 && iy<24) { kind[i] = MAT0; } else { kind[i] = MAT5; } xx[i] = a*(ix+0.5*(iy%2))+x0; yy[i] = a*0.866*iy+y0; vx[i] = 200.0*Math.random()-100.0; vy[i] = 200.0*Math.random()-100.0; ffx[i] = 0.0; ffy[i] = 0.0; fbx[i] = 0.0; fby[i] = 0.0; i += 1; } } } void excite() { int i, ix, iy; double v; v = Math.sqrt(3.0*1.38e-23*contTemp/Morse[MAT0][0]); for (ix=0; ix<40; ix++) { for (iy=0; iy<30; iy++) { i = 30*ix+iy; if (ix<30 && iy>5 && iy<24) { vx[i] = 0.707*v*(2.0*Math.random()-1.0); vy[i] = 0.707*v*(2.0*Math.random()-1.0); } } } } /*------------------------------- molecules motion ---------*/ void calcposition(){ int i; if (started==1) { if (tempMode==1) { vAjustment(); } registration(); for (i=0; i<10; i++) { timeEvolution(); } } } void timeEvolution(){ int i; double rr, tmp; 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; 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]; } } */ } void forceCalc() { int i,j,k; double r2,rij,f,fxij,fyij; for(i=0;i