/* embedded atom method - Ni */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2003.08.09 */ /* ver 0.0.2 2003.09.08 registoration bug fixed */ /* ver 0.0.3 2003.11.07 improved display code */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class nickelEAM extends Applet implements MouseListener, MouseMotionListener, ItemListener, AdjustmentListener, Runnable { /*-------------------------------------- define gloval -----*/ Choice 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 = 20.0/sgm; double xMax = 8.0*sgm; /* x-Box size in (m) */ double yMax = 8.0*sgm; /* y-Box size in (m) */ double zMax = 8.0*sgm; /* z-Box size in (m) */ 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) */ int tempMode = 0; double contTemp = 10.0; double scale = 1.0; double scaleDens = 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 cosTh = Math.cos(theta); double sinTh = Math.sin(theta); double cosFi = Math.cos(fai); double sinFi = Math.sin(fai); 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 regNr[][] = new int[NN][1000]; /* registration */ int reg[][] = new int[NN][1000]; /* registration */ double rijReg[][] = new double[NN][1000]; /* registration */ double mass = 68.71*1.661e-27; /* Ni */ double latticeConstant = 3.52e-10; double atomDia = 2.49; /* A */ double rcut = 4.7895; /* A */ double dr = 0.001; /* A */ double droh = 0.001; double pair[] = new double[8000]; double density[] = new double[8000]; double embedded[] = new double[8000]; int rdf[] = new int[120]; int srtz[][] = new int[2][NN]; /* z-sort work space */ 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} }; int NFx = 28+13; int NFy = 28+13; int NFz = 28+13; double dens[][][] = new double[NFx][NFy][NFz]; double adens[][][] = new double[13][13][13]; /*----------------------------- applet control functions -----*/ public void init() { resize(630,300); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); ctc = new Choice(); ctc.addItem("adiabatic"); ctc.addItem("T scaling"); ctc.addItem("wall cont"); add(new Label("atom = Ni, fcc (100) ")); add(ctc); ctc.addItemListener(this); /* ctc.select("T scaling"); */ scr= new Scrollbar(Scrollbar.HORIZONTAL,1,10,1,160); add(new Label("T=")); add(scr); scr.addAdjustmentListener(this); scs= new Scrollbar(Scrollbar.HORIZONTAL,100,10,20,210); add(new Label("scale=")); add(scs); scs.addAdjustmentListener(this); addMouseListener(this); addMouseMotionListener(this); cvw = new Choice(); cvw.addItem("ball"); cvw.addItem("line"); cvw.addItem("both"); cvw.addItem("real"); cvw.addItem("T color"); cvw.addItem("e density"); add(new Label("view=")); add(cvw); cvw.addItemListener(this); setEAM(); setInitialPosition(); setadens(); setWaku(); 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() == 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 = 10.0*(double)(scr.getValue()); vAjustment(); repaint(); } else if(ev.getSource() == scs) { scale = 0.01*(double)(scs.getValue()); repaint(); } } 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,gb; double sc,sz,tm,bl,tmp,clr; double rx,ry,rz; double AA = 1.0e-10; gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); rotate(theta,fai); zSort(); tmp = temperature(); setRadialDistribution(); cosTh = Math.cos(theta); sinTh = Math.sin(theta); cosFi = Math.cos(fai); sinFi = Math.sin(fai); gbx = 70; gby = 70; sc = dispScale*scale; sz = 0.5*atomDia*1.0e-10*sc; 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.1) { ry = cosFi*((j-6)*AA-cy)+sinFi*((k-6)*AA-cz) + cy; rz = -sinFi*((j-6)*AA-cy)+cosFi*((k-6)*AA-cz) + cz; rx = cosTh*((i-6)*AA-cx)+sinTh*(rz-cz) + cx; rz = -sinTh*((i-6)*AA-cx)+cosTh*(rz-cz) + cz; gx = (int)(sc*rx)+gbx; gy = (int)(sc*ry)+gby; gz = (int)(5.0*(0.4*(scale*rz/zMax)+0.6)*scaleDens*dens[i][j][k]); if (gz>5) { gz = 5; } gOff.setColor(Color.getHSBColor( (float)(0.66-0.66*0.3*dens[i][j][k]),0.9f,0.9f)); 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); if (tempMode==2) { if (tmp>contTemp) { gOff.setColor(Color.black); } else { gOff.setColor(Color.red); } } gOff.drawLine(gx,gy, g2x, g2y); } } gbx = 400; gOff.setColor(Color.gray); for (i=0; i<100; i+=20) { gOff.drawLine(gbx+i,30, gbx+i, 230); } gOff.drawLine(gbx,130, gbx+100, 130); gOff.setColor(Color.black); gOff.drawRect(gbx,30,100,200); gOff.drawString("0",gbx-5,245); gOff.drawString("5 A",gbx+90,245); gOff.setColor(Color.cyan); for (i=0; i<50; i++) { if (rdf[i]>0) { gOff.fillRect(gbx+i*2,230-rdf[i]/4, 2, rdf[i]/4); } } gOff.setColor(Color.black); gOff.drawString("cont T="+contTemp+"K",520,50); gOff.drawString("scale="+(int)(scale*100)+"%",520,70); gOff.drawString("dens="+(int)(scaleDens*100.0+0.5)+"%",520,90); gOff.setColor(Color.blue); gOff.drawString("t="+Math.floor(t*1.0e15+0.5)+"(fs)",520,130); gOff.drawString("T="+temperature()+" K",520,150); } 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; i= 0.0) { r = 1.0; } return ( r ); } /*------------------------- set initial condition ---------*/ void setInitialPosition(){ int i,j,ix,iy,iz; double a; a = 0.5*latticeConstant; i = 0; for (ix=0; ix<8; ix++) { for (iy=0; iy<8; iy++) { for (iz=0; iz<8; iz++) { if ((ix+iy+iz)%2==0) { xx[i] = a*(double)(ix)+1.5*sgm; yy[i] = a*(double)(iy)+1.5*sgm; zz[i] = a*(double)(iz)+1.5*sgm; vx[i] = 100.0*Math.random()-50.0; vy[i] = 100.0*Math.random()-50.0; vz[i] = 100.0*Math.random()-50.0; ffx[i] = 0.0; ffy[i] = 0.0; ffz[i] = 0.0; fbx[i] = 0.0; fby[i] = 0.0; fbz[i] = 0.0; i += 1; } } } } zSortInit(); } /*------------------------------- molecules motion ---------*/ void calcposition(){ int i; if (tempMode==1 || t<1000.0*dt) { vAjustment(); } regNear(); for (i=0; i<10; i++) { timeEvolution(); } if (dispMode==5) { setdens(); } } 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]; vz[i] = rr*vz[i]; } if (yy[i] < 0.0) { yy[i] = 0.0; vx[i] = rr*vx[i]; vy[i] = -rr*vy[i]; vz[i] = rr*vz[i]; } if (yy[i] > yMax) { yy[i] = yMax; vx[i] = rr*vx[i]; vy[i] = -rr*vy[i]; vz[i] = rr*vz[i]; } if (zz[i] < 0.0) { zz[i] = 0.0; vx[i] = rr*vx[i]; vy[i] = rr*vy[i]; vz[i] = -rr*vz[i]; } if (zz[i] > zMax) { zz[i] = zMax; vx[i] = rr*vx[i]; vy[i] = rr*vy[i]; vz[i] = -rr*vz[i]; } } } void forceCalc() { int i,j,k; double fpi,rij,f,fxij,fyij,fzij; for(i=0;ii) { rij = rij = rijReg[i][k]; f = force(rij,fpi); fxij = f*(xx[i]-xx[j])/rij; fyij = f*(yy[i]-yy[j])/rij; fzij = f*(zz[i]-zz[j])/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 rrg,rrg2,r2; rrg = rcut*1.0e-10; rrg += 10000.0*dt*10; rrg2 = rrg*rrg; for(i=0;i=0.0) { rt = (embedded[iroh+1] - embedded[iroh])/droh; } return ( rt ); } double roh(int i) { int j,k; double s; s = 0.0; for(k=1;k