/* Morse and tungsten - periodic - express AFS potential */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2005.01.24 */ /* ver 0.0.2 2005.03.31 regNear() code improved */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class MorseAndWPEFS extends Applet implements MouseListener, MouseMotionListener, ItemListener, AdjustmentListener, Runnable { /*-------------------------------------- define gloval -----*/ Choice cm1,ctc,cvw; Scrollbar scr,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 = 15.0/sgm; double xMax = 16.0*sgm; /* x-Box size in (m) */ double yMax = 16.0*sgm; /* y-Box size in (m) */ double zMax = 16.0*sgm; /* z-Box size in (m) */ int Nbase = 10; int Nmt = Nbase*Nbase*Nbase*2+49; int NN = Nmt + 1; double t = 0.0; double dt = 5.0*1.0e-15; int Nsx = 8; int Nsy = 8; int Nsz = 8; int tempMode = 2; double contTemp = 100.0; double scale = 1.0; int dispMode = 0; double rc = 1.0e-9; double rc2 = rc*rc; double FSmass = 183.85*1.661e-27; double FSd = 4.400224; double FSA = 1.896373; double FSc = 3.25; double FSc0 = 47.1346499; double FSc1 = -33.7665655; double FSc2 = 6.2541999; double FSbb = 90.3; double FSalpha = 1.2; double FSb0 = 2.7411; 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 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} }; int NmatKind = 21; int MAT0 = 0; /* W fixed */ int MAT1 = 11;/* Ba */ int MAT2 = 17;/* Ar */ int kind[] = new int[NN]; double xx[] = new double[NN]; double yy[] = new double[NN]; double zz[] = new double[NN]; double vx[] = new double[NN]; double vy[] = new double[NN]; double vz[] = new double[NN]; double ffx[] = new double[NN]; double ffy[] = new double[NN]; double ffz[] = new double[NN]; double virx[] = new double[NN]; double viry[] = new double[NN]; double virz[] = new double[NN]; int regMorse[][] = new int[NN][100]; int reg[][] = new int[NN][50]; double rijReg[][] = new double[NN][50]; int regNr[][] = new int[NN][100]; int section[][][][] = new int[Nsx][Nsy][Nsz][100]; int kindT[] = new int[NmatKind]; double forceTable[][][] = new double[3][3][10200]; double hh = 1.0e-13; int srtz[][] = new int[2][NN]; int rdf[][] = new int[4][120]; double virial[][] = new double[3][256]; double memp[] = 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,360); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); cm1 = new Choice(); cm1.addItem("W"); cm1.addItem("Mo"); cm1.addItem("Cr"); cm1.addItem("Fe"); cm1.addItem("Ni"); cm1.addItem("Al"); cm1.addItem("Pb"); cm1.addItem("Cu"); cm1.addItem("Ag"); cm1.addItem("Ca"); cm1.addItem("Sr"); cm1.addItem("Ba"); cm1.addItem("Na"); cm1.addItem("K"); cm1.addItem("Rb"); cm1.addItem("Cs"); cm1.addItem("Ne"); cm1.addItem("Ar"); cm1.addItem("Kr"); cm1.addItem("Xe"); cm1.addItem("Hg"); cm1.addItemListener(this); cm1.select("Ba"); ctc = new Choice(); ctc.addItem("adiabatic"); ctc.addItem("t scaling"); ctc.addItem("W T cont."); ctc.addItemListener(this); ctc.select("W T cont."); cvw = new Choice(); cvw.addItem("ball"); cvw.addItem("line"); cvw.addItem("both"); cvw.addItem("real"); cvw.addItem("temp"); cvw.addItemListener(this); scr= new Scrollbar(Scrollbar.HORIZONTAL,100,10,10,810); scr.addAdjustmentListener(this); scs= new Scrollbar(Scrollbar.HORIZONTAL,100,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(cm1); pnl.add(ctc); pnl.add(scr); pnl.add(new Label(" ")); pnl.add(cvw); pnl.add(scs); add(pnl,"North"); setInitialPosition(); setWaku(); } 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() == cm1) { MAT1 = cm1.getSelectedIndex(); t = 0.0; setInitialPosition(); offPaint(); repaint(); } else if (ev.getSource() == ctc) { tempMode = ctc.getSelectedIndex(); offPaint(); repaint(); } else if (ev.getSource() == cvw) { dispMode = cvw.getSelectedIndex(); offPaint(); repaint(); } } public void adjustmentValueChanged(AdjustmentEvent ev){ if(ev.getSource() == scr) { contTemp = 1.0*(double)(scr.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; } 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; int gx,gy,gz,g2x,g2y,gbx,gby,gbz,gb; double sc,sz,tmp,clr,tm; gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); rotate(theta,fai); zSort(); tmp = temperature(); setRadialDistribution(); gbx = 60; gby = 80; sc = dispScale*scale; sz = 2.2*scale/AA; 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; 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); } } 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.gray); gOff.drawLine(gx,gy, g2x, g2y); } } gbx = 460; gby = 120; 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.getHSBColor(0.33f,0.95f,0.95f)); for (i=0; i<100; i++) { if (rdf[0][i]>0) { if (rdf[1][i]>0) { gOff.setColor(Color.getHSBColor(0.33f,0.95f,0.95f)); gOff.drawLine(gbx+i,gby+200-rdf[1][i], gbx+i, gby+200); } if (rdf[2][i]>0) { gOff.setColor(Color.getHSBColor(0.15f,0.95f,0.95f)); gOff.drawLine(gbx+i,gby+200-rdf[2][i], gbx+i, gby+200); } if (rdf[3][i]>0) { gOff.setColor(Color.getHSBColor(0.85f,0.95f,0.95f)); gOff.drawLine(gbx+i,gby+200-rdf[3][i], gbx+i, gby+200); } } } gOff.setColor(Color.black); gOff.drawString("adatom",630/6*0+10,40); gOff.drawString("temp control",630/6*1+10,40); gOff.drawString("cont T="+contTemp+"K",630/6*2+10,40); gOff.drawString("view",630/6*4+10,40); gOff.drawString("scale="+(int)(scale*100.0+0.5)+"%",630/6*5+10,40); gOff.setColor(Color.blue); gOff.drawString("T="+temperature()+" K",630/6*3+10,40); gOff.drawString("t="+Math.floor(t*1.0e15+0.5)+"(fs)",630/6*4+10,60); gOff.drawString("

="+(int)(meanp()/1.0e6)+"MPa",630/6*5+0,60); /* gOff.drawString("P="+(int)(pressure()/1.0e6)+"MPa",630/6*5+10,60); */ gOff.setColor(Color.black); gOff.drawString("box="+(int)(xMax*1.0e10+0.5)/10.0+" x " +(int)(yMax*1.0e10+0.5)/10.0+" x "+(int)(zMax*1.0e10+0.5)/10.0+" nm", 630/6*4+10,80); /* gOff.drawString("reg max="+regMax()+" ",400,300); gOff.drawString("regNr max="+regNrMax()+" ",400,320); gOff.drawString("regM max="+regMorseMax()+" ",400,340); gOff.drawString("sec max="+secMax()+" ",400,360); */ } 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) ); } double matColor(int knd) { double c; c = 0.0; if (knd==MAT0) { c = 0.33; } else if (knd==MAT1) { c = 0.15; }else if (knd==MAT2) { c = 0.85; } return ( c ); } int regMax() { int i,m; m = 0; for(i=0;im) { m = reg[i][0]; } } return(m); } int regNrMax() { int i,m; m = 0; for(i=0;im) { m = regNr[i][0]; } } return(m); } int regMorseMax() { int i,m; m = 0; for(i=0;im) { m = regMorse[i][0]; } } return(m); } int secMax() { int i,j,k,m; m = 0; for(i=0;im) { m = section[i][j][k][0]; } } } } return(m); } /*---------------------------------- 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]==MAT0 && kind[j]==MAT0) { rdf[1][ir] +=1; } else if (kind[i]==MAT1 && kind[j]==MAT1) { rdf[2][ir] +=1; } else { rdf[3][ir] +=1; } } } } } /*------------------------- set initial condition ---------*/ void setForceTable(){ int i,j,ir,k0,k1; double d,a,r0,y,r; int kkk[] = {MAT0,MAT1,MAT2}; kindT[MAT0] = 0; kindT[MAT1] = 1; kindT[MAT2] = 2; for (i=0; i<3; i++) { k0=kkk[i]; for (j=0; j<3; j++) { k1=kkk[j]; d = Math.sqrt(Morse[k0][2]*Morse[k1][2]); a = 0.5*(Morse[k0][3]+Morse[k1][3]); r0 = 0.5*(Morse[k0][4]+Morse[k1][4]); for (ir=100; ir<10000; ir++) { r = (double)ir*1.0e-13; y = Math.exp(-a*(r-r0)); forceTable[i][j][ir]=2.0*d*a*y*(y-1.0); } for (ir=0; ir<100; ir++) { forceTable[i][j][ir]=forceTable[i][j][100]; } for (ir=6000; ir<10000; ir++) { forceTable[i][j][ir] = cutoff(ir)*forceTable[i][j][ir]; } } } } double cutoff(int ir) { double rt; rt = 0.0; if (ir<6000) { rt = 1.0; } else if (ir>=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,j,ix,iy,iz,nb,nb2,nb3; double s,a; setForceTable(); nb = Nbase; nb2 = nb*nb; nb3 = nb*nb*nb; a = 3.0*sgm; s = 3.16e-10; 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 r2,fpi,rij,f,fxij,fyij,fzij; for(i=0;ii && kind[j]==MAT0) { 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); 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; virx[i] += fxij*(xi-xj); viry[i] += fyij*(yi-yj); virz[i] += fzij*(zi-zj); } } } } 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 (r2ip) { xi = xx[ip]; xj = xx[jp]; yi = yy[ip]; yj = yy[jp]; zi = zz[ip]; zj = zz[jp]; 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; }; r2=(xi-xj)*(xi-xj)+(yi-yj)*(yi-yj)+(zi-zj)*(zi-zj); if (r2=Nsx) i = Nsx-1; j = (int)(Nsy*yy[ip]/yMax); if (j>=Nsy) j = Nsy-1; k = (int)(Nsz*zz[ip]/zMax); if (k>=Nsz) k = Nsz-1; iq = section[i][j][k][0]+1; section[i][j][k][0] = iq; section[i][j][k][iq] = ip; } } /*-------------------- registration of near atoms ---*/ void regNear() { int ip,jp,kp,iq; int i,j,k,ii,jj,kk,i0,i1,j0,j1,k0,k1; double rrg,rrg2,r2; rrg = FSc*1.0e-10; if (rrg0.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) { rt = 0.5*Math.sqrt(1.0/rh); } return ( rt ); } double roh(int i) { int j,k; double s; s = 0.0; for(k=1;k=FSb0) { return ( 2.0*(r-FSc)*(FSc0+FSc1*r+FSc2*r*r)+(r-FSc)*(r-FSc)*(FSc1+2.0*FSc2*r) ); } else { return ( 2.0*(r-FSc)*(FSc0+FSc1*r+FSc2*r*r)+(r-FSc)*(r-FSc)*(FSc1+2.0*FSc2*r) + FSbb*(FSb0-r)*(FSb0-r)*Math.exp(-FSalpha*r)*(-3.0-FSalpha*(FSb0-r)) ); } } else { return ( 0.0 ); } } double dfaidr(double r) { if (r