/** applet No. 1041 * * adatom on fcc(111) / bcc(110) / hcp(0001) crystal plane * - table function - Fixed Gupta potential * - multi thread FGMD :: display - asynchronous * * Created by Ikeuchi Mitsuru on October 15 2006. * Copyright (c) 2006 Ikeuchi Mitsuru. All rights reserved. * * ver 0.0.1 2006.10.15 created * ver 0.0.2 2006.12.02 improved code * ver 0.0.3 2007.05.20 added setBoundary() * ver 0.0.4 2007.05.27 improved code * ver 0.0.5 2007.07.14 improved code * ver 0.0.6 2007.09.15 changed virial calculation method * */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class adatomMtPFGMD extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { // ------------------------------------ preset field ----------- Thread th = null; // for run()-paint() thread FixedGuptaMD md = null; FixedGuptaAtom fg = new FixedGuptaAtom(); DrawGraph3d dg3d = new DrawGraph3d(); // for event Choice ch_tempMode, ch_mat, ch_mat2, ch_view; Button bt_reset, bt_startStop, bt_step; Scrollbar sc_temp, sc_scale; // for off-paint buffer Dimension dim; Image imgOff; Graphics gOff; int MAT1 = md.getMAT1(); int MAT2 = md.getMAT2(); // mouse int dgX, dgY, dgXb, dgYb; // display int sleepTime = 100; int dispMode = 0; double viewScale = 1.0; int thCount = 0; // ------------------------------ applet main thread ----------- public void init() { resize(630,460); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); ch_mat = new Choice(); for (int i=0; i0.79) rt = 0.79; gOff.setColor(Color.getHSBColor( col, 0.9f,(float)(rt+0.2))); } else if (mode==2) { // 2-line gOff.setColor(Color.getHSBColor( col, 0.3f,(float)(0.4*pz[j]/zMax+0.3))); for(k=1;kj) { if (md.distance(j,jj)<0.6*(md.getDia(j)+md.getDia(jj))*1.0e-10) { g2x = (int)(sc*px[jj]) + xImageLoc; g2y = (int)(sc*py[jj]) + yImageLoc; gOff.drawLine(gx,gy, g2x, g2y); } } } gOff.setColor(Color.getHSBColor( col, 0.9f,(float)(0.4*pz[j]/zMax+0.3))); } else if (mode==3) { // 3-velocity drawVLineOf(j, sc, 20.0); gOff.setColor(Color.getHSBColor( col, 0.9f,(float)(0.4*pz[j]/zMax+0.3))); } else if (mode==4) { // 4-electron density at atom rg = md.getElectronDensityAt(j)/(md.getggRef(j)*md.getggRef(j)); gz = (int)(gz*rg); gOff.setColor(Color.getHSBColor((float)(0.66-0.33*rg),0.9f,(float)(0.4*pz[j]/zMax+0.3))); } else if (mode==5) { // 5-surface rg = md.getggRef(j); rt = (md.getElectronDensityAt(j)-rg*rg)/(rg*rg); if (rt>0.0) { gz = (int)(gz*1.0*rt); } else { gz = (int)(gz*1.0*(-rt)); } if (gz>20) gz = 20; gOff.setColor(Color.getHSBColor( (float)(0.33+0.3*rt),0.95f,(float)(0.5*pz[j]/zMax+0.2))); } else if (mode==6) { // 6-v space sz = 8.0*size*viewScale; gz = (int)(sz*(0.4*pz[j]/zMax+0.3)); gOff.setColor(Color.getHSBColor(0.05f,0.8f,(float)(0.3*pz[j]/zMax+0.5))); if (md.getvx(j)>0.0) gOff.setColor(Color.getHSBColor(0.66f,0.8f,(float)(0.3*pz[j]/zMax+0.5))); } if (gz>0) gOff.fillOval(gx-gz/2,gy-gz/2, gz, gz); } drawBox(1); } private void drawVLineOf(int j, double sc, double mag) { int gx,gy,g2x,g2y; double p2x,p2y,p2z,rotp2x,rotp2y,rotp2z; gx = (int)(sc*px[j]) + xImageLoc; gy = (int)(sc*py[j]) + yImageLoc; p2x = md.getxx(j)+mag*md.getvx(j)*mag*1.0e-15; p2y = md.getyy(j)+mag*md.getvy(j)*mag*1.0e-15; p2z = md.getzz(j)+mag*md.getvz(j)*mag*1.0e-15; rotp2y = cosFi*(p2y-ccy)+sinFi*(p2z-ccz) + ccy; rotp2z = -sinFi*(p2y-ccy)+cosFi*(p2z-ccz) + ccz; rotp2x = cosTh*(p2x-ccx)+sinTh*(rotp2z-ccz) + ccx; rotp2z = -sinTh*(p2x-ccx)+cosTh*(rotp2z-ccz) + ccz; g2x = (int)(sc*rotp2x) + xImageLoc; g2y = (int)(sc*rotp2y) + yImageLoc; gOff.setColor(Color.getHSBColor(0.05f,0.8f,(float)(0.3*pz[j]/zMax+0.5))); if (md.getvx(j)>0.0) gOff.setColor(Color.getHSBColor(0.66f,0.8f,(float)(0.3*pz[j]/zMax+0.5))); gOff.drawLine(gx,gy, g2x,g2y); } // 3d plot utility private void rotate() { int i; double x,y,z; for (i=0; i=srtz[1][p]) p = i; k = qSortPartition(i,j,srtz[1][p]); qSort(i,k-1); qSort(k,j); } } private int qSortPartition(int i,int j, int x) { int l,r,w; l = i; r = j; while (l<=r) { while (l<=j && srtz[1][l]=i && srtz[1][r]>=x) r--; if (l>r) break; w = srtz[0][l]; srtz[0][l] = srtz[0][r]; srtz[0][r] = w; w = srtz[1][l]; srtz[1][l] = srtz[1][r]; srtz[1][r] = w; l++; r--; } return ( l ); } // private int drawBox(int imode) { int i,gx,gy,g2x,g2y,farPoint; double sc,tmp; if (imode==0) { setBox(); rotateBox(); } sc = dispScale*viewScale; farPoint = findFarPoint(); for (i=0; i<12; i++) { gx = (int)(sc*pwkx[boxp[i][0]])+xImageLoc; gy = (int)(sc*pwky[boxp[i][0]])+yImageLoc; g2x = (int)(sc*pwkx[boxp[i][1]])+xImageLoc; g2y = (int)(sc*pwky[boxp[i][1]])+yImageLoc; if (imode==0) { if (boxp[i][0]==farPoint || boxp[i][1]==farPoint) { gOff.setColor(Color.lightGray); gOff.drawLine(gx,gy, g2x, g2y); } } else if (imode==1) { if (boxp[i][0]!=farPoint && boxp[i][1]!=farPoint) { gOff.setColor(Color.darkGray); if (md.getTempMode()==2) { tmp = md.getTemperature(); if (tmp>md.getContTemp()) { gOff.setColor(Color.black); } else { gOff.setColor(Color.red); } } gOff.drawLine(gx,gy, g2x, g2y); } } } return farPoint; } private int findFarPoint() { int i,im; double m; im = 0; m = pwkz[im]; for (i=0; i<8; i++) { if (pwkz[i]0) { gOff.drawLine(gbx+i-50,gby+250-rd, gbx+i-50, gby+250); } } gOff.setColor(Color.getHSBColor(md.getColorOf(MAT1),0.9f,0.6f)); for(i=50;i<250;i++) { rd = (int)(rdf[1][i]*(ascale/(i*i))+0.5); rd2 = (int)(rdf[1][i+1]*(ascale/(i*i))+0.5); if (rd>0) { gOff.drawLine(gbx+i-50,gby+250-rd, gbx+i+1-50, gby+250-rd2); } } gOff.setColor(Color.getHSBColor(md.getColorOf(MAT2),0.9f,0.6f)); for(i=50;i<250;i++) { rd = (int)(rdf[2][i]*(ascale/(i*i))+0.5); rd2 = (int)(rdf[2][i+1]*(ascale/(i*i))+0.5); if (rd>0) { gOff.drawLine(gbx+i-50,gby+250-rd, gbx+i+1-50, gby+250-rd2); } } } // verocity distribution function private void vdfPlot(double mag) { int gx,gy,i,iy,iy2,hoganWidth,hoganHight; double ascale; setVelocityDistribution(); setMaxwell( md.getContTemp() ); gx = xPlot2dLoc; gy = yPlot2dLoc; ascale = 4000.0/nMax*mag; hoganWidth = 200; hoganHight = 200; // count gOff.setColor(Color.lightGray); for (i=0; i<200; i++) { iy = (int)(ascale*vdf[0][i]); if (iy>0) { gOff.drawLine(gx+i,gy+200-iy,gx+i,gy+200); } } // Maxwell gOff.setColor(Color.getHSBColor(0.01f,0.8f,0.6f)); for (i=0; i<200-1; i++) { iy = (int)(4000*ffvMaxwell[i]); iy2 = (int)(4000*ffvMaxwell[i+1]); if (iy>0) { gOff.drawLine(gx+i,gy+200-iy,gx+i,gy+200-iy2); } } // MAT1 gOff.setColor(Color.getHSBColor(md.getColorOf(MAT1),0.8f,0.6f)); for (i=0; i<200-1; i++) { iy = (int)(4000*meanvdf[1][i]); iy2 = (int)(4000*meanvdf[1][i+1]); if (iy>0) { gOff.drawLine(gx+i,gy+200-iy,gx+i,gy+200-iy2); } } // MAT2 gOff.setColor(Color.getHSBColor(md.getColorOf(MAT2),0.8f,0.6f)); for (i=0; i<200-1; i++) { iy = (int)(4000*meanvdf[2][i]); iy2 = (int)(4000*meanvdf[2][i+1]); if (iy>0) { gOff.drawLine(gx+i,gy+200-iy,gx+i,gy+200-iy2); } } // grid gOff.setColor(Color.gray); for (i=0; i<200; i+=50) { gOff.drawLine(gx+i,gy, gx+i, gy+200); } for (i=0; i<200; i+=100) { gOff.drawLine(gx,gy+200-i, gx+200, gy+200-i); } gOff.setColor(Color.gray); gOff.drawRect(gx,gy,200,200); gOff.setColor(Color.black); gOff.drawString("0",gx-5,gy+hoganHight+20); gOff.drawString("2000 m/s",gx+hoganWidth-30,gy+hoganHight+20); gOff.drawString("velocity distribution",gx+30,gy+hoganHight+40); gOff.setColor(Color.lightGray); gOff.drawString("count",gx+120,gy+20); gOff.setColor(Color.getHSBColor(md.getColorOf(MAT1),0.8f,0.6f)); gOff.drawString("mean distr.",gx+120,gy+40); //gOff.setColor(Color.getHSBColor(md.getColorOf(MAT2),0.8f,0.6f)); //gOff.drawString("mean distr.",gx+120,gy+60); gOff.setColor(Color.getHSBColor(0.01f,0.8f,0.6f)); gOff.drawString("Maxwell(Tc)",gx+120,gy+80); } private void setVelocityDistribution() { int nn,i,iv,knd; double vx,vy,vz,v2,vv; for (i=0; i<220; i++) { vdf[0][i]=0; vdf[1][i]=0; vdf[2][i]=0; } nn = md.getNmt(); for (i=0; i220) continue; v2 = (int)(50.0*mag*2.0*md.getPairInter(ra+0.02,knd1,knd2)); if (v1<220) { gOff.drawLine(gbx+i,gby+200-v1, gbx+i, gby+200-v2); } } gOff.setColor(Color.getHSBColor(0.01f,0.8f,0.9f)); gOff.drawString("Veff",gbx+80,gby+80); for(i=0;i<200;i++) { ra = 0.02*i+1.0; v1 = (int)(50.0*mag*md.getEffectiveInter(ra,knd1,knd2)); if (v1>220) continue; v2 = (int)(50.0*mag*md.getEffectiveInter(ra+0.02,knd1,knd2)); if (v1<220) { gOff.drawLine(gbx+i,gby+200-v1, gbx+i, gby+200-v2); } } } // ------------------------------------- I/O methods ----------- public void setViewDelta(double xDisplacement, double yDisplacement) { viewTheta += 0.5*3.14159/180.0*xDisplacement; viewFai += 0.5*3.14159/180.0*yDisplacement; cosTh = Math.cos(viewTheta); sinTh = Math.sin(viewTheta); cosFi = Math.cos(viewFai); sinFi = Math.sin(viewFai); } public void setLoc(int gx, int gy) { xImageLoc = gx; yImageLoc = gy; } public void setScale(double sc) { viewScale = sc; } } // ================================== Gupta atom class =========== class FixedGuptaAtom { private static final double AU = 1.661e-27; private static final double TB[][] = { // 0 mass 1 A(eV) 2 x(eV) 3 p 4 q 5 r0(A) 6 G/xx 7 color 8 f/bcc { 26.98*AU, 0.1602, 1.5074, 7.5681, 2.7456, 2.8634, 3.552, 0.26, 0.0 }, // 00 Al { 40.08*AU, 0.0492, 0.6842, 11.2115, 2.6841, 3.9471, 3.557, 0.20, 0.0 }, // 01 Ca { 58.71*AU, 0.0565, 1.4005, 14.0867, 1.7937, 2.4918, 3.655, 0.39, 0.0 }, // 02 Ni { 63.54*AU, 0.0783, 1.2355, 11.1832, 2.3197, 2.5560, 3.589, 0.42, 0.0 }, // 03 Cu { 87.62*AU, 0.0257, 0.5557, 12.3406, 1.8105, 4.3027, 3.652, 0.17, 0.0 }, // 04 Sr {102.91*AU, 0.1086, 1.9776, 14.1315, 2.5555, 2.6901, 3.567, 0.60, 0.0 }, // 05 Rh {106.40*AU, 0.1223, 1.5193, 11.3225, 3.0697, 2.7511, 3.532, 0.63, 0.0 }, // 06 Pd {107.87*AU, 0.0812, 1.1081, 11.5597, 2.8316, 2.8890, 3.546, 0.66, 0.0 }, // 07 Ag {192.20*AU, 0.2141, 2.7082, 12.8986, 3.4541, 2.7145, 3.513, 0.70, 0.0 }, // 08 Ir {195.09*AU, 0.2906, 2.6715, 10.1423, 3.7878, 2.7746, 3.501, 0.73, 0.0 }, // 09 Pt {196.97*AU, 0.1935, 1.7581, 10.4342, 3.9472, 2.8838, 3.497, 0.76, 0.0 }, // 10 Au {207.19*AU, 0.0851, 0.8699, 10.0667, 3.3563, 3.5003, 3.517, 0.79, 0.0 }, // 11 Pb {232.04*AU, 0.1200, 2.0937, 9.8344, 1.7972, 3.5951, 3.560, 0.82, 0.0 }, // 12 Th { 6.94*AU, 0.0488, 0.5729, 6.3675, 1.3969, 3.0391, 3.734, 0.11, 1.0 }, // 13 Li { 22.99*AU, 0.0353, 0.4083, 7.8536, 1.7477, 3.7158, 3.579, 0.09, 1.0 }, // 14 Na { 39.10*AU, 0.0230, 0.3170, 9.3093, 1.6143, 4.6073, 3.633, 0.06, 1.0 }, // 15 K { 50.94*AU, 0.2572, 2.3126, 6.8543, 2.1886, 2.6223, 3.435, 0.30, 1.0 }, // 16 V { 52.00*AU, 0.0407, 1.1012, 13.1852, 0.8993, 2.4981, 4.048, 0.36, 1.0 }, // 17 Cr { 55.85*AU, 0.1184, 1.5418, 10.7613, 2.0379, 2.4824, 3.479, 0.33, 1.0 }, // 18 Fe { 85.47*AU, 0.0292, 0.3233, 8.1532, 1.9235, 4.9363, 3.516, 0.03, 1.0 }, // 19 Rb { 92.91*AU, 0.4546, 3.6302, 5.2702, 2.0552, 2.6033, 3.474, 0.45, 1.0 }, // 20 Nb { 95.94*AU, 0.2043, 2.5097, 10.0154, 2.0511, 2.7253, 3.475, 0.48, 1.0 }, // 21 Mo {132.91*AU, 0.0270, 0.3036, 8.4120, 1.9433, 5.3174, 3.509, 0.01, 1.0 }, // 22 Cs {137.34*AU, 0.0400, 0.6167, 10.1835, 1.5070, 4.3466, 3.680, 0.14, 1.0 }, // 23 Ba {180.95*AU, 0.3281, 3.3008, 8.2764, 2.2371, 2.8601, 3.422, 0.52, 1.0 }, // 24 Ta {183.85*AU, 0.2490, 3.2055, 10.3715, 1.9916, 2.7410, 3.493, 0.55, 1.0 }, // 25 W { 47.90*AU, 0.1519, 1.8112, 8.6200, 2.3900, 2.9510, 3.600, 0.24, 2.0 }, // 26 Ti { 91.22*AU, 0.1934, 2.2792, 8.2500, 2.2490, 3.2320, 3.600, 0.26, 2.0 }, // 27 Zr { 58.93*AU, 0.0950, 1.4880, 11.6040, 2.2860, 2.5070, 3.500, 0.30, 2.0 }, // 28 Co { 24.31*AU, 0.0290, 0.4992, 12.8200, 2.2570, 3.1760, 3.600, 0.22, 2.0 }, // 29 Mg { 20.18*AU, 0.0031, 0.0302, 10.1900, 2.3900, 3.1320, 3.500, 0.90, 0.0 }, // 30 Ne { 39.95*AU, 0.0042, 0.0661, 14.6500, 2.3100, 3.7170, 3.500, 0.92, 0.0 }, // 31 Ar { 83.80*AU, 0.0038, 0.0830, 14.3500, 2.0300, 4.0350, 3.500, 0.94, 0.0 }, // 32 Kr {131.30*AU, 0.0075, 0.1182, 14.7700, 2.1500, 4.3860, 3.500, 0.96, 0.0 } // 33 Xe }; private static final int kindMax = 34; private static final String matStr[] = { "Al","Ca","Ni","Cu","Sr","Rh","Pd","Ag","Ir","Pt","Au","Pb","Th", "Li","Na","K","V","Cr","Fe","Rb","Nb","Mo","Cs","Ba","Ta","W", "Ti","Zr","Co","Mg","Ne","Ar","Kr","Xe" }; private double pairTBL[][][] = new double[kindMax][kindMax][1000]; private double faiTBL[][][] = new double[kindMax][kindMax][1000]; private double ggRef[][] = new double[kindMax][kindMax]; // ------------------------------- class constructor ----------- FixedGuptaAtom() { setTable(); } // private void setTable() { int knd,ir,i,j; double TBmass,TBA,TBx,TBp,TBq,TBr0,TBG,rsw,rcut; double ra; for (knd=0; kndi) { for (ir=1; ir<1000; ir++) { ra = 0.01*ir; pairTBL[i][j][ir] = Math.sqrt(pairTBL[i][i][ir]*pairTBL[j][j][ir]); faiTBL[i][j][ir] = Math.sqrt(faiTBL[i][i][ir]*faiTBL[j][j][ir]); pairTBL[j][i][ir] = pairTBL[i][j][ir]; faiTBL[j][i][ir] = faiTBL[i][j][ir]; } ggRef[i][j] = Math.sqrt( ggRef[i][i]*ggRef[j][j] ); ggRef[j][i] = ggRef[i][j]; } } } } private double cutoffTB(double rsw, double rcut, double ra) { double x; if (ra>=rcut) return (0.0); if (ra<=rsw) return (1.0); x = (ra-rsw)/(rcut-rsw); return (1.0+x*x*x*(-10.0+x*(15.0-6.0*x))); } // ----------------------------------- class methods ----------- public double force(double r, int ki, int kj) { double h,ra,rt; h = 0.01; ra = r*1.0e10; rt = -0.5*(effectiveInter(ra+h,ki,kj)-effectiveInter(ra-h,ki,kj))/h; return ( rt*1.6e-19/1.0e-10 ); } public double effectiveInter(double ra, int ki, int kj) { double gg,y; gg = ggRef[ki][kj]; y = faiInter(ra,ki,kj)/gg; return ( 2.0*pairInter(ra,ki,kj) - y + y*y/(4.0*gg) ); } public double pairInter(double ra, int ki, int kj) { int i; double a,hh; hh = 0.01; i = (int)(ra/hh); a = ra - i*hh; return ( ((hh-a)*pairTBL[ki][kj][i] + a*pairTBL[ki][kj][i+1])/hh ); } public double faiInter(double ra, int ki, int kj) { int i; double a,hh; hh = 0.01; i = (int)(ra/hh); a = ra - i*hh; return ( ((hh-a)*faiTBL[ki][kj][i] + a*faiTBL[ki][kj][i+1])/hh ); } // tight-binding Potential Calculation /* double forceTB(double r) { double h,ra,rt; h = 0.001; ra = r*1.0e10; rt = -0.5*(effectivePotential(ra+h)-effectivePotential(ra-h))/h; return ( rt*1.6e-19/1.0e-10 ); } double effectivePotential(double ra) { double y; y = faiTB(ra)/TBG; return ( 2.0*pairPotential(ra) - y + y*y/(4.0*TBG) ); } double pairPotential(double ra) { return ( cutoff(ra)*TBA*Math.exp(-TBp*(ra/TBr0-1.0)) ); } double faiTB(double ra) { return ( cutoff(ra)*TBx*TBx*Math.exp(-2.0*TBq*(ra/TBr0-1.0)) ); } double cutoff(double ra) { double x; if (ra>=rcut) return (0.0); if (ra<=rsw) return (1.0); x = (ra-rsw)/(rcut-rsw); return (1.0+x*x*x*(-10.0+x*(15.0-6.0*x))); } */ // ------------------------------------- I/O methods ----------- public double getAU() { return AU; } public int getkindMax() { return kindMax; } public String getMatStr(int knd) { return matStr[knd]; } public double getggRefOf(int knd) { return ggRef[knd][knd]; } public double getMassOf(int knd) { return TB[knd][0]; } public double getDiaOf(int knd) { return TB[knd][5]; } public double getColorOf(int knd) { return TB[knd][7]; } public int getXtalKindOf(int knd) { return (int)(TB[knd][8]+0.5); } } // ======== molecular dynamics - fixed Gupta potential =========== class FixedGuptaMD extends Thread { private FixedGuptaAtom fg; private static int Nmt = 10000; private static double xMax = 5.0*1.0e-9; private static double yMax = 5.0*1.0e-9; private static double zMax = 5.0*1.0e-9; private static int MAT1 = 25; // W private static int MAT2 = 23; // Ba private double t = 0.0; private double dt = 1.0*1.0e-15; private int statMode = 1; private int tempMode = 1; private double contTemp = 300.0; private double contPress = 0.0; private double xxVirial = 0.0; private double yyVirial = 0.0; private double zzVirial = 0.0; private double xyVirial = 0.0; private double xzVirial = 0.0; private double yzVirial = 0.0; private int Nsx = 16; private int Nsy = 16; private int Nsz = 16; private static final int NN = 10000; private int kind[] = new int[NN]; private double xx[] = new double[NN]; private double yy[] = new double[NN]; private double zz[] = new double[NN]; private double vx[] = new double[NN]; private double vy[] = new double[NN]; private double vz[] = new double[NN]; private double ffx[] = new double[NN]; private double ffy[] = new double[NN]; private double ffz[] = new double[NN]; private double electronDensityAt[][] = new double[NN][2]; private int regNr[][] = new int[NN][250]; private int section[][][][] = new int[Nsx][Nsy][Nsz][100]; private int resetSW = 0; private int startSW = 1; private int stepSW = 0; private int sleepTime = 1; private int stopSleepTime = 100; private int count = 0; // ------------------------------- class constructor ----------- FixedGuptaMD(FixedGuptaAtom fga) { fg = fga; setInitialCondition(); } // -------------------------------------- thread run ----------- public void run() { while (true) { count += 1; timeEvolution(); if (sleepTime>0) { try { Thread.sleep(sleepTime); } catch (InterruptedException e) { } } } } // --------------------------- set initial condition ----------- private void setInitialCondition() { int i; double a; count = 0; t = 0.0; i = 0; // base crystal plane if (fg.getXtalKindOf(MAT1)==0) { i = setFcc111YBase(i, MAT1); } else if (fg.getXtalKindOf(MAT1)==1) { i = setBcc110YBase(i, MAT1); } else if (fg.getXtalKindOf(MAT1)==2) { i = setHcp0001YBase(i, MAT1); } // adatom a = 0.6*(fg.getDiaOf(MAT1)+fg.getDiaOf(MAT2))*1.0e-10; i = setAdatom(i, MAT2, 0.5*yMax-a); Nmt = i; 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; } } removeMacroMotion(); initVirial(); } private void initVirial() { xxVirial = 0.0; yyVirial = 0.0; zzVirial = 0.0; xyVirial = 0.0; xzVirial = 0.0; yzVirial = 0.0; } // fcc(111) plane int setFcc111YBase(int ii, int knd) { int nx,ny,nz; double a,b,c,size; a = 1.01*0.5*fg.getDiaOf(knd)*1.0e-10; b = (Math.sqrt(3.0)/3.0)*a; c = (Math.sqrt(6.0)/3.0)*2.0*a; size = 5.5e-9; nx = 2*(int)(size/a/4.0); ny = (int)(0.48*yMax/c); nz = 2*(int)(size/b/6.0); return( setFcc111YPlane(ii, knd, nx, ny, nz, 0.5*yMax) ); } int setFcc111YPlane(int ii, int knd, int nx, int ny, int nz, double yPos) { int ip,ix,iy,iz,nnx,nnz; double a,b,c,rm; ip = ii; a = 1.01*0.5*fg.getDiaOf(knd)*1.0e-10; b = (Math.sqrt(3.0)/3.0)*a; c = (Math.sqrt(6.0)/3.0)*2.0*a; rm = 10.0/Math.sqrt(fg.getMassOf(knd)/fg.getAU()); nnx = nx*2; nnz = nz*3; xMax = a*nnx; zMax = b*nnz; for (ix=0; ix0.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; if (zij>0.5*zMax) zij -= zMax; if (zij<-0.5*zMax) zij += zMax; rij = Math.sqrt(xij*xij+yij*yij+zij*zij); f = fg.force(rij,kind[i],kind[j]); fxij = f*xij/rij; fyij = f*yij/rij; fzij = f*zij/rij; ffx[i] += fxij; ffy[i] += fyij; ffz[i] += fzij; ffx[j] += -fxij; ffy[j] += -fyij; ffz[j] += -fzij; xxvir += fxij*xij; yyvir += fyij*yij; zzvir += fzij*zij; xyvir += fxij*yij; xzvir += fxij*zij; yzvir += fyij*zij; } } xxVirial = 0.995*xxVirial + 0.005*xxvir; yyVirial = 0.995*yyVirial + 0.005*yyvir; zzVirial = 0.995*zzVirial + 0.005*zzvir; xyVirial = 0.995*xyVirial + 0.005*xyvir; xzVirial = 0.995*xzVirial + 0.005*xzvir; yzVirial = 0.995*yzVirial + 0.005*yzvir; } private void setBoundary() { int i; double rr, tmp; 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] = 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] += zMax; } if (zz[i] > zMax) { zz[i] -= zMax; } } } // registration of near atoms private void regNearTB() { int ip,jp,kp,iq; int i,j,k,ii,jj,kk,i0,i1,j0,j1,k0,k1; double rrg,rrg2,r2,rcutoff,rcutoff2; double xij,yij,zij; preRegistration(); rcutoff = fg.getDiaOf(MAT1)*1.732; if (fg.getXtalKindOf(MAT1)==1) rcutoff = fg.getDiaOf(MAT1)*1.6; if (fg.getXtalKindOf(MAT1)==2) rcutoff = fg.getDiaOf(MAT1)*2.2362; rcutoff2 = fg.getDiaOf(MAT2)*1.732; if (fg.getXtalKindOf(MAT2)==1) rcutoff2 = fg.getDiaOf(MAT2)*1.6; if (fg.getXtalKindOf(MAT2)==2) rcutoff2 = fg.getDiaOf(MAT2)*2.2362; if (rcutoff=Nsy) j1 = Nsy-1; k0 = (int)(Nsz*(zz[ip]-rrg)/zMax+(double)Nsz)-Nsz; k1 = (int)(Nsz*(zz[ip]+rrg)/zMax); for(i=i0;i<=i1;i++) { ii = (i+Nsx)%Nsx; for(j=j0;j<=j1;j++) { jj = j; for(k=k0;k<=k1;k++) { kk = (k+Nsz)%Nsz; for(iq=1;iq<=section[ii][jj][kk][0];iq++) { jp = section[ii][jj][kk][iq]; if (jp>ip) { xij = xx[ip]-xx[jp]; yij = yy[ip]-yy[jp]; zij = zz[ip]-zz[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; if (zij>0.5*zMax) zij -= zMax; if (zij<-0.5*zMax) zij += zMax; r2 = xij*xij+yij*yij+zij*zij; 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; } } // ----------------------------------------- utility ----------- private void vAjustment() { int i; double tmp, r; tmp = temperature(); r = Math.sqrt(contTemp/tmp); for (i=0; ixMax+d) { x = xMax + d; } else if (xyMax+d) { y = yMax + d; } else if (yzMax+d) { z = zMax + d; } else if (z0.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; if (zij>0.5*zMax) zij -= zMax; if (zij<-0.5*zMax) zij += zMax; rij = Math.sqrt(xij*xij+yij*yij+zij*zij); fij = fg.faiInter(rij*1.0e10, kind[i], kind[j]); electronDensityAt[i][1] += fij; electronDensityAt[j][1] += fij; } } for(i=0;i