/* fcc crystal - periodic Rafii-Tarar and Sutton potential */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2003.10.19 */ /* ver 0.0.2 2003.10.20 bug fixed */ /* ver 0.0.3 2004.02.18 improved pannel layout */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class fccCrystalPRTS extends Applet implements MouseListener, MouseMotionListener, ItemListener, AdjustmentListener, Runnable { /*-------------------------------------- define gloval -----*/ Choice cm1,ctc,cvw; Scrollbar scr,scp; 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 = 30.0/sgm; double xMax0 = 6.0*sgm; /* x-Box size in (m) */ double yMax0 = 6.0*sgm; /* y-Box size in (m) */ double zMax0 = 6.0*sgm; /* z-Box size in (m) */ double xMax = xMax0; double yMax = yMax0; double zMax = zMax0; int Nmt = 8*8*8/2; /* number of molecules */ int NN = Nmt + 1; double t = 0.0; /* time (s) */ double dt = 0.5*1.0e-15; /* time division (s) */ double volRatio = 1.0; int tempMode = 1; double contTemp = 100.0; double contPress = 1.0*1.0e5; double scale = 1.0; int dispMode = 0; int dgX, dgY, dgXb, dgYb; double cx = 0.5*xMax; double cy = 0.5*yMax; double cz = 0.5*zMax; double theta = -20.0*3.14/180.0; double fai = 10.0*3.14/180.0; double dtheta = 0.0*3.14/180.0; double pai = 3.1415926536; double AA = 1.0e-10; double AU = 1.661e-27; double SuttonChen[][] = { /* atom 0 mass 1 m 2 n 3 eps 4 c 5 a */ /* 0 Ni */ { 58.71*AU, 6.0, 9.0, 1.5713e-2, 39.755, 3.52 }, /* 1 Cu */ { 63.54*AU, 6.0, 9.0, 1.2386e-2, 39.755, 3.61 }, /* 2 Rh */ { 102.91*AU, 6.0, 12.0, 4.9371e-3, 145.658, 3.80 }, /* 3 Pd */ { 106.40*AU, 7.0, 12.0, 4.1790e-3, 108.526, 3.89 }, /* 4 Ag */ { 107.87*AU, 6.0, 12.0, 2.5415e-3, 145.658, 4.09 }, /* 5 Ir */ { 192.20*AU, 6.0, 14.0, 2.4489e-3, 337.831, 3.84 }, /* 6 Pt */ { 195.09*AU, 8.0, 10.0, 1.9835e-2, 34.428, 3.92 }, /* 7 Au */ { 196.97*AU, 8.0, 10.0, 1.2794e-2, 34.428, 4.08 }, /* 8 Pb */ { 207.19*AU, 7.0, 10.0, 5.5772e-3, 45.882, 4.95 }, /* 9 Al */ { 26.98*AU, 6.0, 7.0, 3.3307e-2, 16.460, 4.05 } }; int MAT1 = 0; /* Ni */ int MAT2 = 9; /* Al */ int kindMax = 10; double RTSm[][] = new double[kindMax][kindMax]; double RTSn[][] = new double[kindMax][kindMax]; double RTSa[][] = new double[kindMax][kindMax]; double RTSeps[][] = new double[kindMax][kindMax]; double rcutoff = 2.0*3.52e-10; 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 zz[] = new double[NN]; /* i-th z-position */ double vx[] = new double[NN]; /* i-th x-velocity */ double vy[] = new double[NN]; /* i-th y-velocity */ double vz[] = new double[NN]; /* i-th z-velocity */ double ffx[] = new double[NN]; /* i-th x-force */ double ffy[] = new double[NN]; /* i-th y-force */ double ffz[] = new double[NN]; /* i-th z-force */ double fbx[] = new double[NN]; /* i-th x-force before dt */ double fby[] = new double[NN]; /* i-th y-force before dt */ double fbz[] = new double[NN]; /* i-th z-force before dt */ int reg[][] = new int[NN][680]; /* registration */ double rijReg[][] = new double[NN][680]; /* registration */ int regNr[][] = new int[NN][680]; /* registration */ int srtz[][] = new int[2][NN]; /* z-sort work space */ int rdf[][] = new int[4][120]; double virial[][] = new double[3][256]; double memTemp[] = new double[256]; int virialp = 0; double px[] = new double[NN]; double py[] = new double[NN]; double pz[] = new double[NN]; double wkx[] = new double[8]; double wky[] = new double[8]; double wkz[] = new double[8]; double pwkx[] = new double[8]; double pwky[] = new double[8]; double pwkz[] = new double[8]; int boxp[][] = { {0,1},{0,2},{0,4},{1,3},{1,5},{2,3},{2,6},{4,5},{4,6},{3,7},{5,7},{6,7} }; /*----------------------------- applet control functions -----*/ public void init() { resize(630,300); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); cm1 = new Choice(); cm1.addItem("Ni"); cm1.addItem("Cu"); cm1.addItem("Rh"); cm1.addItem("Pd"); cm1.addItem("Ag"); cm1.addItem("Ir"); cm1.addItem("Pt"); cm1.addItem("Au"); cm1.addItem("Pb"); cm1.addItem("Al"); cm1.addItemListener(this); ctc = new Choice(); ctc.addItem("adiabatic"); ctc.addItem("T scaling"); ctc.addItemListener(this); ctc.select("T scaling"); cvw = new Choice(); cvw.addItem("ball"); cvw.addItem("line"); cvw.addItem("both"); cvw.addItem("temp"); cvw.addItem("real"); cvw.addItemListener(this); scr= new Scrollbar(Scrollbar.HORIZONTAL,10,10,1,210); scr.addAdjustmentListener(this); scp= new Scrollbar(Scrollbar.HORIZONTAL,30,10,1,210); scp.addAdjustmentListener(this); addMouseListener(this); addMouseMotionListener(this); setLayout(new BorderLayout()); Panel pnl = new Panel(); pnl.setLayout(new GridLayout(1,6,5,0)); pnl.add(cm1); pnl.add(ctc); pnl.add(cvw); pnl.add(new Label(" ")); pnl.add(scr); pnl.add(scp); add(pnl,"North"); setRTS(); 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() == ctc){ tempMode = ctc.getSelectedIndex(); } else if (ev.getSource() == cm1){ MAT1 = cm1.getSelectedIndex(); t = 0.0; setInitialPosition(); setWaku(); } else if (ev.getSource() == cvw){ dispMode = cvw.getSelectedIndex(); } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == scr) { contTemp = 10.0*(double)(scr.getValue()); vAjustment(); } else if (ev.getSource() == scp) { contPress = 1.0e5*(double)(scp.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; } theta += 0.5*3.14/180.0*(dgX-dgXb); fai += 0.5*3.14/180.0*(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,j,k,jj,farPoint,im,ip; int gx,gy,gz,g2x,g2y,gbx,gby, gb; double sc,sa,sb,tmp,tm,bl,clr,mtm; gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); setWaku(); setRadialDistribution(); rotate(theta,fai); zSort(); tmp = temperature(); gbx = 60; gby = 80; sc = dispScale*scale; sa = 0.5*sc*0.707*SuttonChen[MAT1][5]*1.0e-10; sb = 0.5*sc*0.707*SuttonChen[MAT2][5]*1.0e-10; farPoint = findMin(); for (i=0; i<12; i++) { gx = (int)(sc*pwkx[boxp[i][0]])+gbx; gy = (int)(sc*pwky[boxp[i][0]])+gby; g2x = (int)(sc*pwkx[boxp[i][1]])+gbx; g2y = (int)(sc*pwky[boxp[i][1]])+gby; if (boxp[i][0]==farPoint || boxp[i][1]==farPoint) { gOff.setColor(Color.lightGray); gOff.drawLine(gx,gy, g2x, g2y); } } if (dispMode==0) { for (i=0; ij) { if (distance(j,jj)<1.15*0.707*0.5*(SuttonChen[kind[j]][5]+SuttonChen[kind[jj]][5])*1.0e-10) { g2x = (int)(sc*px[jj])+gbx; g2y = (int)(sc*py[jj])+gby; gOff.setColor(Color.gray); gOff.drawLine(gx,gy, g2x, g2y); } } } } } else if (dispMode==2) { bl = 0.90*sa*1.0e-10; for (i=0; ij) { if (distance(j,jj)<1.15*0.707*0.5*(SuttonChen[kind[j]][5]+SuttonChen[kind[jj]][5])*1.0e-10) { g2x = (int)(sc*px[jj])+gbx; g2y = (int)(sc*py[jj])+gby; gOff.setColor(Color.gray); gOff.drawLine(gx,gy, g2x, g2y); } } } gz = (int)(sa*(0.4*pz[j]/zMax+0.6)); gOff.setColor(Color.getHSBColor(0.33f,0.95f,(float)(0.4*pz[j]/zMax+0.4))); gOff.fillOval(gx-gz/2,gy-gz/2, gz, gz); } } else if (dispMode==3) { for (i=0; i0.99) { tm = 0.99; } gOff.setColor(Color.getHSBColor((float)clr,0.9f,(float)tm)); gOff.fillOval(gx-gz/2,gy-gz/2, gz, gz); } }else if (dispMode==4) { for (i=0; icontTemp) { gOff.setColor(Color.black); } else { gOff.setColor(Color.red); } } gOff.drawLine(gx,gy, g2x, g2y); } } gbx = 400; gby = 60; gOff.setColor(Color.gray); for (i=0; i<100; i+=20) { gOff.drawLine(gbx+i,gby, gbx+i, gby+200); } gOff.drawLine(gbx,gby+100, gbx+100, gby+100); gOff.setColor(Color.black); gOff.drawRect(gbx,gby,100,200); gOff.drawString("0",gbx-5,gby+215); gOff.drawString("5 A",gbx+90,gby+215); gOff.setColor(Color.cyan); for (i=0; i<100; i++) { if (rdf[0][i]>0) { gOff.setColor(Color.getHSBColor(0.33f,0.95f,0.95f)); gOff.drawLine(gbx+i,gby+200-rdf[1][i]/2, gbx+i, gby+200); gOff.setColor(Color.getHSBColor(0.66f,0.95f,0.95f)); gOff.drawLine(gbx+i,gby+200-rdf[2][i]/2, gbx+i, gby+200); gOff.setColor(Color.getHSBColor(0.12f,0.95f,0.95f)); gOff.drawLine(gbx+i,gby+200-rdf[3][i]/2, gbx+i, gby+200); } } gOff.setColor(Color.black); gOff.drawString("atom",630/6*0+10,40); gOff.drawString("temp control",630/6*1+10,40); gOff.drawString("view",630/6*2+10,40); gOff.drawString("cont T="+contTemp+"K",630/6*4+10,40); gOff.drawString("cont P="+(int)(contPress/1.0e3+0.5)+"kPa",630/6*5+10,40); gb = 520; mtm = meanTemp(); gOff.setColor(Color.black); gOff.drawString("a="+SuttonChen[MAT1][5]+"A",gb,80); gOff.setColor(Color.blue); gOff.drawString("t="+Math.floor(t*1.0e15+0.5)+"(fs)",gb,100); gOff.drawString("L="+(int)(xMax*1.0e13+0.5)/10.0+" pm",gb,120); gOff.drawString("V="+(int)(xMax*yMax*zMax*1.0e29+0.5)/100.0+" nm3",gb,140); gOff.drawString("T="+tmp+" K",gb,160); gOff.drawString("P="+(int)(pressure1()/1.0e6+0.5)+"MPa",gb,180); gOff.drawString("="+(int)(mtm*10+0.5)/10.0+" K",gb,200); gOff.drawString("

="+(int)(pressure()/1.0e6+0.5)+"MPa",gb,220); gOff.drawString("nk="+(int)(Nmt*1.38e-23*mtm/(xMax*yMax*zMax)/1.0e6+0.5)+"MPa",gb,240); } double distance(int i,int j) { double x,y,z; x = xx[i]-xx[j]; y = yy[i]-yy[j]; z = zz[i]-zz[j]; return(Math.sqrt(x*x+y*y+z*z)); } /*---------------------------------- findMin() ----------*/ int findMin() { int i,im; double m; im = 0; m = pwkz[im]; for (i=0; i<8; i++) { if (pwkz[i]srtz[1][j+1]) { w = srtz[0][j]; srtz[0][j]=srtz[0][j+1]; srtz[0][j+1]=w; w = srtz[1][j]; srtz[1][j]=srtz[1][j+1]; srtz[1][j+1]=w; } } } } void zSortInit() { int i,j,w; for (i=0; isrtz[1][j+1]) { w = srtz[0][j]; srtz[0][j]=srtz[0][j+1]; srtz[0][j+1]=w; w = srtz[1][j]; srtz[1][j]=srtz[1][j+1]; srtz[1][j+1]=w; } } } } /*------------------------------------- rotate ----------*/ void rotate(double th,double fi) { int i; double cosTh,sinTh,cosFi,sinFi; cosTh = Math.cos(th); sinTh = Math.sin(th); cosFi = Math.cos(fi); sinFi = Math.sin(fi); for (i=0; i0.5*xMax) { xj += xMax; }; if (xi-xj<-0.5*xMax) { xj -= xMax; }; if (yi-yj>0.5*yMax) { yj += yMax; }; if (yi-yj<-0.5*yMax) { yj -= yMax; }; if (zi-zj>0.5*zMax) { zj += zMax; }; if (zi-zj<-0.5*zMax) { zj -= zMax; }; r2=(xi-xj)*(xi-xj)+(yi-yj)*(yi-yj)+(zi-zj)*(zi-zj); rij = Math.sqrt(r2); if (rij<5.0e-10) { ir = (int)(Math.floor(rij*2.0e11+0.49999)); rdf[0][ir] +=1; if (kind[i]==MAT1 && kind[j]==MAT1) { rdf[1][ir] +=1; } else if (kind[i]==MAT2 && kind[j]==MAT2) { rdf[2][ir] +=1; } else { rdf[3][ir] +=1; } } } } } /*-------------------- pressure ----------*/ void initVirial() { int i; for (i=0; i<256; i++) { virial[0][i] = 0.0; virial[1][i] = 0.0; virial[2][i] = 0.0; memTemp[i] = 0.0; } virialp = 0; } void setVirial() { int i; double xVir,yVir,zVir; xVir = 0.0; yVir = 0.0; zVir = 0.0; for (i=0; ixMax+d) { x = xMax + d; } else if (xyMax+d) { y = yMax + d; } else if (yzMax+d) { z = zMax + d; } else if (z1.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; } if (zz[i] < 0.0) { zz[i] += zMax; } if (zz[i] > zMax) { zz[i] -= zMax; } } } void forceCalc() { int i,j,k; double xi,xj,yi,yj,zi,zj; double fpi,rij,f,fxij,fyij,fzij; for(i=0;ii) { xi = xx[i]; xj = xx[j]; yi = yy[i]; yj = yy[j]; zi = zz[i]; zj = zz[j]; if (xi-xj>0.5*xMax) { xj += xMax; }; if (xi-xj<-0.5*xMax) { xj -= xMax; }; if (yi-yj>0.5*yMax) { yj += yMax; }; if (yi-yj<-0.5*yMax) { yj -= yMax; }; if (zi-zj>0.5*zMax) { zj += zMax; }; if (zi-zj<-0.5*zMax) { zj -= zMax; }; rij = rijReg[i][k]; f = force(rij,fpi,kind[i],kind[j]); fxij = f*(xi-xj)/rij; fyij = f*(yi-yj)/rij; fzij = f*(zi-zj)/rij; ffx[i] += fxij; ffy[i] += fyij; ffz[i] += fzij; ffx[j] += -fxij; ffy[j] += -fyij; ffz[j] += -fzij; } } } } /*-------------------- registration of near atoms ---*/ void regNear() { int i,j,k; double xi,xj,yi,yj,zi,zj; double rrg,rrg2,r2; rrg = rcutoff; rrg += 3000.0*dt*10; rrg2 = rrg*rrg; for(i=0;i0.5*xMax) { xj += xMax; }; if (xi-xj<-0.5*xMax) { xj -= xMax; }; if (yi-yj>0.5*yMax) { yj += yMax; }; if (yi-yj<-0.5*yMax) { yj -= yMax; }; if (zi-zj>0.5*zMax) { zj += zMax; }; if (zi-zj<-0.5*zMax) { zj -= zMax; }; r2=(xi-xj)*(xi-xj)+(yi-yj)*(yi-yj)+(zi-zj)*(zi-zj); if (r20.5*xMax) { xj += xMax; }; if (xi-xj<-0.5*xMax) { xj -= xMax; }; if (yi-yj>0.5*yMax) { yj += yMax; }; if (yi-yj<-0.5*yMax) { yj -= yMax; }; if (zi-zj>0.5*zMax) { zj += zMax; }; if (zi-zj<-0.5*zMax) { zj -= zMax; }; r2=(xi-xj)*(xi-xj)+(yi-yj)*(yi-yj)+(zi-zj)*(zi-zj); if (r20.0) { ret = 0.5*Math.sqrt(1.0/rh); } return ( ret ); } double roh(int i) { int j,k; double s,ra; s = 0.0; for(k=1;k