/** applet No. 1228 * * sintering nickel(fcc) - molecular dynamics 3D * - selected fixed Gupta potential (SFG) * - multi thread SFGMD :: display - asynchronous * * Created by Ikeuchi Mitsuru on October 14 2007. * Copyright (c) 2007 Ikeuchi Mitsuru. All rights reserved. * * ver 0.0.1 2007.10.14 created * */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class sinteringNiSFG 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(2); // Ni(fcc)=2 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 = 2; int MAT2 = 2; int dgX, dgY, dgXb, dgYb; // mouse // 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 = electronDensityAt[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 = (electronDensityAt[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.getColorOfKind(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.getColorOfKind(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.getColorOfKind(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.getColorOfKind(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.getColorOfKind(MAT1),0.8f,0.6f)); gOff.drawString("mean distr.",gx+120,gy+40); //gOff.setColor(Color.getHSBColor(md.getColorOfKind(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 =========== // // selected fixed Gupta potential // 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][]; private double [][][] faiTBL = new double[kindMax][kindMax][]; private double [][] ggRef = new double[kindMax][kindMax]; // ------------------------------- class constructor ----------- FixedGuptaAtom() { int i,j; for (i=0; ii) { setTable(i, j); } } } } FixedGuptaAtom(int knd) { malocTBL(knd, knd); setTable(knd); } FixedGuptaAtom(int ki,int kj) { malocTBL(ki, ki); malocTBL(kj, kj); malocTBL(ki, kj); malocTBL(kj, ki); setTable(ki); setTable(kj); setTable(ki,kj); setTable(kj,ki); } FixedGuptaAtom(int ki,int kj,int kk) { malocTBL(ki, ki); malocTBL(kj, kj); malocTBL(kk, kk); malocTBL(ki, kj); malocTBL(kj, ki); malocTBL(ki, kk); malocTBL(kk, ki); malocTBL(kj, kk); malocTBL(kk, kj); setTable(ki); setTable(kj); setTable(kk); setTable(ki,kj); setTable(kj,ki); setTable(ki,kk); setTable(kk,ki); setTable(kj,kk); setTable(kk,kj); } private void malocTBL(int ki, int kj) { pairTBL[ki][kj] = new double[1000]; faiTBL[ki][kj] = new double[1000]; } // private void setTable(int knd) { int ir; double TBmass,TBA,TBx,TBp,TBq,TBr0,TBG,rsw,rcut; double ra; TBmass = TB[knd][0]; TBA = TB[knd][1]; TBx = TB[knd][2]; TBp = TB[knd][3]; TBq = TB[knd][4]; TBr0 = TB[knd][5]; TBG = TB[knd][6]*TBx; rsw = 1.414*TBr0; rcut = 1.732*TBr0; if ((int)(TB[knd][8]+0.5)==1) { rsw = 1.2*TBr0; rcut = 1.6*TBr0; } else if ((int)(TB[knd][8]+0.5)==2) { rsw = 1.9149*TBr0; rcut = 2.2362*TBr0; } ggRef[knd][knd] = TBG; for (ir=1; ir<1000; ir++) { ra = 0.01*ir; pairTBL[knd][knd][ir] = cutoffTB(rsw,rcut,ra)*TBA*Math.exp(-TBp*(ra/TBr0-1.0)); faiTBL[knd][knd][ir] = cutoffTB(rsw,rcut,ra)*TBx*TBx*Math.exp(-2.0*TBq*(ra/TBr0-1.0)); } } private void setTable(int i, int j) { int ir; double ra; if (j>i) { 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 ); } // ------------------------------------- I/O methods ----------- public double getAU() { return AU; } public int getkindMax() { return kindMax; } public String getMatStr(int i) { return matStr[i]; } 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 = 20000; private static double xMax = 6.4*1.0e-9; private static double yMax = 6.4*1.0e-9; private static double zMax = 6.4*1.0e-9; private static int MAT1 = 2; // Ni private static int MAT2 = 2; // Ni private double t = 0.0; private double dt = 1.0*1.0e-15; private int tempMode = 1; private double contTemp = 300.0; private double contPress = 0.0; private double xVirial = 0.0; private double yVirial = 0.0; private double zVirial = 0.0; private int Nsx = 24; private int Nsy = 24; private int Nsz = 24; private static final int NN = 20000; 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 int regNr[][] = new int[NN][100]; private int section[][][][] = new int[Nsx][Nsy][Nsz][50]; 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 nm; t = 0.0; count = 0; nm = 1.0e-9; i = 0; i = setNanoParticle(i,MAT1, 1.7*nm, 1.7*nm, 3.2*nm, 1.4*nm, 0.0*Math.PI/4.0, 1.0*Math.PI/2.0); i = setNanoParticle(i,MAT1, 1.7*nm, 4.7*nm, 3.2*nm, 1.4*nm, 1.0*Math.PI/4.0, 0.0); i = setNanoParticle(i,MAT1, 4.7*nm, 1.7*nm, 3.2*nm, 1.4*nm, 2.0*Math.PI/4.0, 0.0); i = setNanoParticle(i,MAT1, 4.7*nm, 4.7*nm, 3.2*nm, 1.4*nm, 3.0*Math.PI/4.0, 1.0*Math.PI/2.0); Nmt = i; removeMacroMotion(); initVirial(); } private void initVirial() { xVirial = 0.0; yVirial = 0.0; zVirial = 0.0; } private int setNanoCube(int ii, int knd, double x0, double y0, double z0, double cLength, double th, double fi) { int xtal; xtal = fg.getXtalKindOf(knd); if (xtal==0) { // fcc return setFCCNanoCube(ii, knd, x0, y0, z0, cLength, th, fi); } else if (xtal==1) { // bcc return setBCCNanoCube(ii, knd, x0, y0, z0, cLength, th, fi); } else if (xtal==2) { // hcp return setHCPNanoCube(ii, knd, x0, y0, z0, cLength, th, fi); } return -1; } private int setNanoParticle(int ii, int knd, double x0, double y0, double z0, double radius, double th, double fi) { int xtal; xtal = fg.getXtalKindOf(knd); if (xtal==0) { // fcc return setFCCNanoParticle(ii, knd, x0, y0, z0, radius, th, fi); } else if (xtal==1) { // bcc return setBCCNanoParticle(ii, knd, x0, y0, z0, radius, th, fi); } else if (xtal==2) { // hcp return setHCPNanoParticle(ii, knd, x0, y0, z0, radius, th, fi); } return -1; } // fcc private int setFCCNanoCube(int ii, int knd, double x0, double y0, double z0, double cLength, double th, double fi) { int ip,i,j,k,n; double a,len, x,y,z, xp,yp,zp, sth,cth,sfi,cfi; ip = ii; a = 1.0/Math.sqrt(2.0)*fg.getDiaOf(knd)*1.0e-10; sth = Math.sin(th); cth = Math.cos(th); sfi = Math.sin(fi); cfi = Math.cos(fi); len = 1.8*cLength; n = (int)(len/a) + 1; for (i=0; i=x0 && xp<=x0+cLength && yp>=y0 && yp<=y0+cLength && zp>=z0 && zp<=z0+cLength) { kind[ip] = knd; xx[ip] = xp; yy[ip] = yp; zz[ip] = zp; vx[ip] = 500.0*(Math.random()-0.5); vy[ip] = 500.0*(Math.random()-0.5); vz[ip] = 500.0*(Math.random()-0.5); ffy[ip] = 0.0; ffy[ip] = 0.0; ffz[ip] = 0.0; ip += 1; } } } } } return ip; } private int setFCCNanoParticle(int ii, int knd, double x0, double y0, double z0, double radius, double th, double fi) { int ip,i,j,k,n; double a,len, x,y,z, xp,yp,zp, sth,cth,sfi,cfi; ip = ii; a = 1.0/Math.sqrt(2.0)*fg.getDiaOf(knd)*1.0e-10; sth = Math.sin(th); cth = Math.cos(th); sfi = Math.sin(fi); cfi = Math.cos(fi); len = 2.0*radius; n = (int)(len/a) + 1; for (i=0; i=x0 && xp<=x0+cLength && yp>=y0 && yp<=y0+cLength && zp>=z0 && zp<=z0+cLength) { kind[ip] = knd; xx[ip] = xp; yy[ip] = yp; zz[ip] = zp; vx[ip] = 500.0*(Math.random()-0.5); vy[ip] = 500.0*(Math.random()-0.5); vz[ip] = 500.0*(Math.random()-0.5); ffy[ip] = 0.0; ffy[ip] = 0.0; ffz[ip] = 0.0; ip += 1; } } } } } return ip; } private int setBCCNanoParticle(int ii, int knd, double x0, double y0, double z0, double radius, double th, double fi) { int ip,i,j,k,n; double a,len, x,y,z, xp,yp,zp, sth,cth,sfi,cfi; ip = ii; a = 1.0/Math.sqrt(3.0)*fg.getDiaOf(knd)*1.0e-10; sth = Math.sin(th); cth = Math.cos(th); sfi = Math.sin(fi); cfi = Math.cos(fi); len = 2.0*radius; n = (int)(len/a) + 1; for (i=0; i=x0 && xp<=x0+cLength && yp>=y0 && yp<=y0+cLength && zp>=z0 && zp<=z0+cLength) { kind[ip] = knd; xx[ip] = xp; yy[ip] = yp; zz[ip] = zp; vx[ip] = 500.0*(Math.random()-0.5); vy[ip] = 500.0*(Math.random()-0.5); vz[ip] = 500.0*(Math.random()-0.5); ffy[ip] = 0.0; ffy[ip] = 0.0; ffz[ip] = 0.0; ip += 1; } } } } return ip; } private int setHCPNanoParticle(int ii, int knd, double x0, double y0, double z0, double radius, double th, double fi) { int ip,i,j,k,nx,ny,nz; double a,b,c,len, x,y,z, xp,yp,zp, sth,cth,sfi,cfi; ip = ii; a = 1.0*fg.getDiaOf(knd)*1.0e-10; b = a*Math.sqrt(3.0)/2.0; c = a*Math.sqrt(2.0/3.0); sth = Math.sin(th); cth = Math.cos(th); sfi = Math.sin(fi); cfi = Math.cos(fi); len = 2.0*radius; nx = (int)(len/a) + 1; ny = (int)(len/b) + 1; nz = (int)(len/c) + 1; for (i=0; i1.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]; } } } // 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=Nsx) i1 = Nsx-1; j0 = (int)(Nsy*(yy[ip]-rrg)/yMax); if (j0<0) j0 = 0; j1 = (int)(Nsy*(yy[ip]+rrg)/yMax); if (j1>=Nsy) j1 = Nsy-1; k0 = (int)(Nsz*(zz[ip]-rrg)/zMax); if (k0<0) k0 = 0; k1 = (int)(Nsz*(zz[ip]+rrg)/zMax); if (k1>=Nsz) k1 = Nsz-1; for(i=i0;i<=i1;i++) { for(j=j0;j<=j1;j++) { for(k=k0;k<=k1;k++) { for(iq=1;iq<=section[i][j][k][0];iq++) { jp = section[i][j][k][iq]; if (jp>ip) { xij = xx[ip]-xx[jp]; yij = yy[ip]-yy[jp]; zij = zz[ip]-zz[jp]; 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; im) { m = regNr[i][0]; } } return(m); } public int secMax() { int i,j,k,m; m = 0; for(i=0;im) { m = section[i][j][k][0]; } } } } return(m); } // private double pressure() { double vol; vol = xMax*yMax*zMax; return (Nmt*1.38e-23*temperature()+(xVirial+yVirial+zVirial)/3.0)/vol; } private double temperature() { int i; double s; s = 0.0; for (i=0; i