/** applet No. 1253 * * template - Langevin dynamics 2D * - Lennard-Jones potential * - multi thread LD2D :: display - asynchronous * * Created by Ikeuchi Mitsuru on January 26 2008. * Copyright (c) 2008 Ikeuchi Mitsuru. All rights reserved. * * ver 0.0.1 2008.01.26 created * */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class templateLD2D extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { // ------------------------------------ preset field ----------- Thread th = null; // for run()-paint() thread Thread thmd = null; // for LD2D() thread LJMolecule ma = new LJMolecule(); LD2D md = new LD2D(ma); 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; 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)(mag*meanRDF[i][1]*(1600.0/(i*i))); n2 = (int)(mag*meanRDF[i+1][1]*(1600.0/(i*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)(mag*meanRDF[i][2]*(1600.0/(i*i))); n2 = (int)(mag*meanRDF[i+1][2]*(1600.0/(i*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^2)",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 && r0) { try { Thread.sleep(sleepTime); } catch (InterruptedException e) { } } } } // --------------------------- set initial condition ----------- private void setInitialCondition() { int i; double s; count = 0; t = 0.0; s = xMax/40.0; 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 = ma.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 double gaussianRandom() { // Box-Muller method double rnd; rnd = Math.sqrt( -2.0*Math.log(Math.random()) ); return rnd*Math.sin(2.0*Math.PI*Math.random()); } 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 float getColorOf(int knd) { return (float)ma.getColorOf(knd); } public double getDia(int i) { return ma.getDiaOf(kind[i]); } public double getMass(int i) { return ma.getMassOf(kind[i]); } public float getColor(int i) { return (float)ma.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(); } }