/** applet No. 1043 * * template - periodic molecular dynamics 2D * - multi thread MorseMD :: display - asynchronous * * Created by Ikeuchi Mitsuru on October 21 2006. * Copyright (c) 2006-2007 Ikeuchi Mitsuru. All rights reserved. * * ver 0.0.1 2006.10.21 created * ver 0.0.2 2006.10.29 improved code * ver 0.0.3 2006.12.03 improved code * ver 0.0.4 2007.05.26 improved code * ver 0.0.5 2007.07.01 change Particles class * ver 0.0.6 2007.09.02 radial distribution (n/r^2) -> (n/r) * */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class MorseMtPMD2D extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { // ------------------------------------ preset field ----------- Thread th = null; // for run()-paint() thread Particles ma = new Particles(); PeriodicMD2D 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 = 0; 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; i 2",gbh*1+20,70); gOff.setColor(Color.getHSBColor(md.getColorOf(md.getMAT2()),0.9f,0.6f)); gOff.drawString("mat 2",gbh*2+20,70); */ gOff.setColor(Color.black); gOff.drawString("Tcont="+md.getContTemp()+"K",gbh*3+10,70); gOff.drawString("scale="+(int)(viewScale*100.0+0.499)+"%",gbh*4+10,70); gOff.drawString("view",gbh*5+10,70); gOff.setColor(Color.blue); gOff.drawString("t="+(int)(md.getTime()*1.0e14+0.5)/100.0+" ps",gbh*0+10,90); gOff.drawString("N="+md.getNmt()+" ",gbh*2+10,90); gOff.drawString("T="+(int)(md.getTemperature()*10+0.5)/10.0+" K",gbh*3+10,90); gOff.drawString("Lx="+(int)(md.getxMax()*1.0e10+0.5)/10.0+" nm",gbh*4+10,90); gOff.setColor(Color.blue); gOff.drawString("regMax="+md.getRegMax()+"",540,90); gOff.setColor(Color.black); gOff.drawString("thread MD = "+md.getCount()+" ",20,440); gOff.drawString("thread disp = "+thCount+" ",220,440); } // ------------------------------------ plot methods ----------- private void ballPlot(double dia, double tempSpan) { int i,ix,iy,ir; double sc,tm; sc = viewScale*dispScale; for (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 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]; } } // 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 && r=0.8*rCutoff && r=600 && ir<1000) { rt = 0.5+0.5*Math.cos(3.1415926536*(((double)ir)/1000.0-0.6)/0.4); } else { rt = 0.0; } return( rt ); } // ----------------------------------- class methods ----------- public double force(double r, int ki, int kj) { int i; double a; i = (int)(r/hh); a = r - i*hh; return ( ((hh-a)*forceTable[ki][kj][i] + a*forceTable[ki][kj][i+1])/hh ); } // ------------------------------------- I/O methods ----------- public static int getKindMax() { return kindMax; } public static String getMatStr(int knd) { return matStr[knd]; } public static double getMassOf(int knd) { return ion[knd][0]; } public static double getDiaOf(int knd) { return 2.0*ion[knd][5]; } public static float getColorOf(int knd) { return (float)ion[knd][6]; } public static double getrCutoff() { return rCutoff; } public static double getdt() { return dt; } } */ // ==================== periodic molecular dynamics 2D =========== class PeriodicMD2D extends Thread { private Particles particle; private double t = 0.0; private double dt = Particles.getdt(); private double xMax = 25.0*1.0e-9; private double yMax = 25.0*1.0e-9; private int Nmt = 40*40; private int Nsx = 50; private int Nsy = 50; private int MAT1 = particle.getKindMax(); // all private int MAT2 = 13; // K private int mat2content = 50; // 0-100 private int tempMode = 1; private double contTemp = 1000.0; private int selectedMaterialKind = 0; public final int NN = 10000; private int kind[] = new int[NN]; private double xx[] = new double[NN]; private double yy[] = new double[NN]; private double vx[] = new double[NN]; private double vy[] = new double[NN]; private double ffx[] = new double[NN]; private double ffy[] = new double[NN]; private int reg[][] = new int[NN][100]; private int section[][][] = new int[Nsx][Nsy][50]; private int resetSW = 0; private int startSW = 1; private int stepSW = 1; private int sleepTime = 1; private int stopSleepTime = 100; private int count = 0; // ------------------------------- class constructor ----------- PeriodicMD2D(Particles p) { particle = p; 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, kindMax; double s; count = 0; t = 0.0; kindMax = particle.getKindMax(); s = 0.8*xMax/40.0; for (i=0; i0.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; r2=xij*xij+yij*yij; if (r21.2) { rr=1.2; }; } for (i=0; i xMax) { xx[i] -= xMax; } if (yy[i] < 0.0) { yy[i] += yMax; } if (yy[i] > yMax) { yy[i] -= yMax; } } } //registration private void registration() { int i,j,ii,jj,ip,jp,kp,i0,i1,j0,j1,iq; double xij,yij,r2,rreg,rreg2; preRegistration(); rreg = particle.getrCutoff() + 3000.0*10*dt; rreg2 = rreg*rreg; for(ip=0;ipip) { xij = xx[ip] - xx[jp]; yij = yy[ip] - yy[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; r2=xij*xij+yij*yij; 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 double getxMax() { return xMax; } public 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 int getnnReg(int i) { return reg[i][0]; } public int getReg(int i, int k) { return reg[i][k]; } public int getRegMax() { return regMax(); } }