/** applet No. 1215 * * K-doped tungsten - molecular dynamics 2D * - selected Morse potential * - multi thread MorseMD :: display - asynchronous * * Created by Ikeuchi Mitsuru on September 23 2007. * Copyright (c) 2007 Ikeuchi Mitsuru. All rights reserved. * * ver 0.0.1 2007.09.23 created * */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class dopedWMtSMD2D extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { // ------------------------------------ preset field ----------- Thread th = null; // for run()-paint() thread Particles ma = new Particles(0,13); // W, K MolecularDynamics2D md = null; DrawGraph2D dg2d = new DrawGraph2D(); // for event Choice ch_mat1, ch_mat2, ch_tempControl, ch_view; Button bt_reset, bt_startStop, bt_step; Scrollbar sc_content, sc_temp, sc_scale; // for off-paint buffer private Dimension dim; private Image imgOff; private Graphics gOff; private int dgX, dgY, dgXb, dgYb; // mouse private int sleepTime = 50; private double viewScale = 1.0; private int dispMode = 4; private 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_mat1 = new Choice(); for (int i=0; i0.0) { tm = md.getTemp(i); tm = 0.8*tm/tempSpan+0.199; if (tm>0.99) tm = 0.99; } gOff.setColor(Color.getHSBColor((float)(md.getColor(i)),0.95f,(float)tm)); gOff.fillOval(ix-ir/2,iy-ir/2, ir, ir); } } private void grainPlot() { int i,j,k,ix,iy,ix2,iy2; double sc,x,y,r2,dij,gcol; for (i=0; i<200; i++) { adf[i] = 0; } sc = viewScale*dispScale; for (i=0; ii) { ix2 = xImageLoc + (int)(sc*md.getxx(j)); iy2 = yImageLoc + (int)(sc*md.getyy(j)); gcol = grainColor(x,y); adf[(int)(gcol*200.0)] += 1; gOff.setColor(Color.getHSBColor((float)gcol,0.9f,0.9f)); gOff.drawLine(ix,iy, ix2,iy2); } } } } private double grainColor(double x, double y) { double th,col; th = 3.0*(Math.atan2(y,x)/Math.PI + 1.0); return (th-(int)th); } private void linePlot() { int i,j,k,ix,iy,ix2,iy2; double sc,r2,dij; sc = viewScale*dispScale; for (i=0; ii) { ix2 = xImageLoc + (int)(sc*md.getxx(j)); iy2 = yImageLoc + (int)(sc*md.getyy(j)); gOff.setColor(Color.gray); gOff.drawLine(ix,iy, ix2,iy2); } } } } private void velocityPlot(double vSpan) { int i,ix,iy,ix2,iy2; double sc; sc = viewScale*dispScale; for (i=0; i0) { gOff.fillRect(gx+i*2,gy+hoganHight-n1,2,n1); } } /* gOff.setColor(Color.getHSBColor(md.getColorOf(md.getMAT1()),0.9f,0.6f)); for (i=10; i<100-1; i++) { n1 = (int)(a*meanRDF[i][1]/i); n2 = (int)(a*meanRDF[i+1][1]/i); gOff.drawLine(gx+i*2,gy+hoganHight-n1,gx+i*2+2,gy+hoganHight-n2); } gOff.setColor(Color.getHSBColor(md.getColorOf(md.getMAT2()),0.9f,0.6f)); for (i=10; i<100-1; i++) { n1 = (int)(a*meanRDF[i][2]/i); n2 = (int)(a*meanRDF[i+1][2]/i); gOff.drawLine(gx+i*2,gy+hoganHight-n1,gx+i*2+2,gy+hoganHight-n2); } */ drawHogan(gx, gy, hoganWidth, hoganHight, xDiv, yDiv); gOff.setColor(Color.black); gOff.drawString("0",gx-5,gy+hoganHight+20); gOff.drawString("1 (nm)",gx+hoganWidth-20,gy+hoganHight+20); gOff.drawString("radial distribution (n/r)",gx+20,gy+hoganHight+40); } private void setRadialDistribution() { int i,j,k,ir,m1,m2,ki,kj; double xij,yij,rij; for (i=0; i<120; i++) { rdf[i][0]=0; rdf[i][1]=0; rdf[i][2]=0; } m1 = md.getMAT1(); m2 = md.getMAT2(); for (i=0; i119) ir=119; rdf[ir][0] +=1; if (ki==m1 && kj==m1) { rdf[ir][1] += 1; } else if (ki==m2 && kj==m2) { rdf[ir][2] += 1; } } } } for (i=0; i<120; i++) { meanRDF[i][0] = 0.9*meanRDF[i][0]+0.1*rdf[i][0]; meanRDF[i][1] = 0.9*meanRDF[i][1]+0.1*rdf[i][1]; meanRDF[i][2] = 0.9*meanRDF[i][2]+0.1*rdf[i][2]; } } // velocity distribution private void vdfPlot(int gx, int gy, double mag) { int i,n1,n2; double yMag; setVelocityDistribution(); yMag = mag*0.005*Nmt; gOff.setColor(Color.lightGray); for (i=0; i<200-1; i++) { n1 = (int)(yMag*meanVDF[i][0]); gOff.drawLine(gx+i,gy+200-n1,gx+i,gy+200); } /* gOff.setColor(Color.getHSBColor(md.getColorOf(md.getMAT1()),0.9f,0.6f)); for (i=0; i<200-2; i++) { n1 = (int)(yMag*meanVDF[i][1]); n2 = (int)(yMag*meanVDF[i+1][1]); gOff.drawLine(gx+i,gy+200-n1,gx+i+1,gy+200-n2); } gOff.setColor(Color.getHSBColor(md.getColorOf(md.getMAT2()),0.9f,0.6f)); for (i=0; i<200-2; i++) { n1 = (int)(yMag*meanVDF[i][2]); n2 = (int)(yMag*meanVDF[i+1][2]); gOff.drawLine(gx+i,gy+200-n1,gx+i+1,gy+200-n2); } */ drawHogan(gx, gy, 200, 200, 50, 100); gOff.setColor(Color.black); gOff.drawString("0",gx-5,gy+220); gOff.drawString("1000",gx+100-15,gy+220); gOff.drawString("(m/s)",gx+200-30,gy+220); gOff.drawString("velocity distribution",gx+20,gy+235); } private void setVelocityDistribution() { int i,iv,m1,m2,knd; double vx,vy,v; for(i=0;i<200;i++) { vdf[i][0] = 0; vdf[i][1] = 0; vdf[i][2] = 0; } m1 = md.getMAT1(); m2 = md.getMAT2(); for(i=0;i199) iv = 199; vdf[iv][0] += 1; if (knd==m1) { vdf[iv][1] += 1; } else if (knd==m2) { vdf[iv][2] += 1; } } for(i=0;i<200;i++) { meanVDF[i][0] = 0.98*meanVDF[i][0]+0.02*vdf[i][0]; meanVDF[i][1] = 0.98*meanVDF[i][1]+0.02*vdf[i][1]; meanVDF[i][2] = 0.98*meanVDF[i][2]+0.02*vdf[i][2]; } } // azimuth distribution private void adfPlot(int gx, int gy, double mag) { int i,n1,n2; double yMag; yMag = 10000.0/Nmt*mag; gOff.setColor(Color.lightGray); for (i=0; i<200; i++) { n1 = (int)(yMag*adf[i]); gOff.setColor(Color.getHSBColor((float)(i/200.0),0.9f,0.8f)); gOff.drawLine(gx+i,gy+200-n1,gx+i,gy+200); } drawHogan(gx, gy, 200, 200, 50, 100); gOff.setColor(Color.black); gOff.drawString("0",gx-5,gy+220); gOff.drawString("PI/3",gx+200-15,gy+220); gOff.drawString("azimuth distribution",gx+20,gy+235); } // private void drawHogan(int gx, int gy, int hoganWidth, int hoganHight, int xDiv, int yDiv) { int i; gOff.setColor(Color.gray); for (i=0; i=0.8*rCutoff && r0) { try { Thread.sleep(sleepTime); } catch (InterruptedException e) { } } } } // --------------------------- set initial condition ----------- private void setInitialCondition() { int i,ix,iy; double nm; count = 0; t = 0.0; nm = 1.0e-9; i = 0; i = setNanoBlock(i,MAT1, 0.6*nm, 0.6*nm, 6.0*nm, 6.0*nm, 0.00*Math.PI); i = setNanoBlock(i,MAT1, 6.8*nm, 0.6*nm, 6.0*nm, 6.0*nm, 0.25*Math.PI); i = setNanoBlock(i,MAT1,13.4*nm, 0.6*nm, 6.0*nm, 6.0*nm, 0.50*Math.PI); i = setNanoBlock(i,MAT1, 0.6*nm, 6.8*nm, 6.0*nm, 6.0*nm, 0.75*Math.PI); i = setNanoBlock(i,MAT1, 6.8*nm, 6.8*nm, 6.0*nm, 6.0*nm, 0.00*Math.PI); i = setNanoBlock(i,MAT1,13.4*nm, 6.8*nm, 6.0*nm, 6.0*nm, 0.25*Math.PI); i = setNanoBlock(i,MAT1, 0.6*nm,13.4*nm, 6.0*nm, 6.0*nm, 0.50*Math.PI); i = setNanoBlock(i,MAT1, 6.8*nm,13.4*nm, 6.0*nm, 6.0*nm, 0.75*Math.PI); i = setNanoBlock(i,MAT1,13.4*nm,13.4*nm, 6.0*nm, 6.0*nm, 0.00*Math.PI); i = setLine(i, MAT2, 0.6*nm, 13.1*nm, 19.4*nm, 13.1*nm); i = setLine(i, MAT2, 13.1*nm, 0.6*nm, 13.1*nm, 12.8*nm); i = setLine(i, MAT2, 13.1*nm,13.4*nm, 13.1*nm, 19.4*nm); Nmt = i; vAjustment(); } private int setNanoBlock(int ii, int knd, double x0, double y0, double xLen, double yLen, double th) { int ip,i,j,nx,ny; double a,b, len, x,y,xp,yp, sth,cth; ip = ii; a = 0.98*particle.getDiaOf(knd); b = 0.866025*a; len = xLen; if (len=x0 && xp<=x0+xLen && yp>=y0 && yp<=y0+yLen) { kind[ip] = knd; xx[ip] = xp; yy[ip] = yp; vx[ip] = 500.0*(Math.random()-0.5); vy[ip] = 500.0*(Math.random()-0.5); ffy[ip] = 0.0; ffy[ip] = 0.0; ip += 1; } } } return ip; } private int setLine(int ii, int knd, double x0, double y0, double x1, double y1) { int ip,i,n; double a, len, x,y; ip = ii; a = 0.98*particle.getDiaOf(knd); len = Math.sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)); n = (int)(len/a)+1; for (i=0; i<=n; i++) { x = x0 + i*((x1-x0)/n); y = y0 + i*((y1-y0)/n); kind[ip] = knd; xx[ip] = x; yy[ip] = y; vx[ip] = 500.0*(Math.random()-0.5); vy[ip] = 500.0*(Math.random()-0.5); ffy[ip] = 0.0; ffy[ip] = 0.0; ip += 1; } return ip; } // ---------------------------------- time evolution ----------- private void timeEvolution(){ if (resetSW==1) { setInitialCondition(); resetSW = 0; } if (startSW==1) { timeStep(); } else { if (stepSW==1) { timeStep(); stepSW = 0; } try { Thread.sleep(stopSleepTime); } catch (InterruptedException e) { } } } private void timeStep() { int i; if (tempMode==1) { vAjustment(); } registration(); for (i=0; i<10; i++) { time1Step(); } } private void time1Step() { int i; double dtv2, a2; dtv2 = dt/2.0; t = t + dt; 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]; } if (yy[i] < 0.0) { yy[i] = 0.0; vx[i] = rr*vx[i]; vy[i] = -rr*vy[i]; } if (yy[i] > yMax) { yy[i] = yMax; vx[i] = rr*vx[i]; vy[i] = -rr*vy[i]; } } } //registration private void registration() { int i,j,ip,jp,kp,i0,i1,j0,j1,iq; double r2,rreg,rreg2; preRegistration(); rreg = particle.getrCutoff() + 3000.0*10*dt; rreg2 = rreg*rreg; for(ip=0;ip=Nsx) i1 = Nsx-1; j0 = (int)(Nsy*(yy[ip]-rreg)/yMax); if (j0<0) j0 = 0; j1 = (int)(Nsy*(yy[ip]+rreg)/yMax); if (j1>=Nsy) j1 = Nsy-1; for(i=i0;i<=i1;i++) { for(j=j0;j<=j1;j++) { for(iq=1;iq<=section[i][j][0];iq++) { jp = section[i][j][iq]; if (jp>ip) { r2=(xx[ip]-xx[jp])*(xx[ip]-xx[jp])+(yy[ip]-yy[jp])*(yy[ip]-yy[jp]); if (r2=Nsx) i = Nsx-1; j = (int)(Nsy*yy[ip]/yMax); if (j>=Nsy) j = Nsy-1; iq = section[i][j][0]+1; section[i][j][0] = iq; section[i][j][iq] = ip; } } // ----------------------------------------- utility ----------- private void vAjustment() { int i; double tmp, r; tmp = temperature(); r = Math.sqrt(contTemp/tmp); for (i=0; im) m = reg[i][0]; } return(m); } // ------------------------------------- I/O methods ----------- // control public void reset() { resetSW = 1; } public void setStartSW(int sw) { startSW = sw; } public int getStartSW() { return startSW; } public void setStepSW() { stepSW = 1; } public int getCount() { return count; } public void setTempMode(int tmode) { tempMode = tmode; } public int getTempMode() { return tempMode; } public void setContTemp(double tmp) { contTemp = tmp; vAjustment(); } public double getContTemp() { return contTemp; } public void setMAT1(int m) { MAT1 = m; resetSW = 1; } public int getMAT1() { return MAT1; } public void setMAT2(int m) { MAT2 = m; resetSW = 1; } public int getMAT2() { return MAT2; } public void setMat1content(int m2c) { mat2content = m2c; resetSW = 1; } public int getMat2content() { return mat2content; } // get data public double getTime() { return t; } public double getdt() { return dt; } public int getNmt() { return Nmt; } public static double getxMax() { return xMax; } public static double getyMax() { return yMax; } public float getColorOf(int knd) { return (float)particle.getColorOf(knd); } public double getDia(int i) { return particle.getDiaOf(kind[i]); } public double getMass(int i) { return particle.getMassOf(kind[i]); } public float getColor(int i) { return (float)particle.getColorOf(kind[i]); } public int getKind(int i) { return kind[i]; } public double getxx(int i) { return xx[i]; } public double getyy(int i) { return yy[i]; } public double getvx(int i) { return vx[i]; } public double getvy(int i) { return vy[i]; } public double getTemp(int i) { return temp(i); } public double getTemperature() { return temperature(); } public double getPressure() { return pressure(); } public int getnnReg(int i) { return reg[i][0]; } public int getReg(int i, int k) { return reg[i][k]; } public int getRegMax() { return regMax(); } }