/** applet No. 1255 * * template - Langevin dynamics 3D * - Lennard-Jones potential * - multi thread LD3D :: display - asynchronous * * Created by Ikeuchi Mitsuru on February 02 2008. * Copyright (c) 2008 Ikeuchi Mitsuru. All rights reserved. * * ver 0.0.1 2008.02.02 created * */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class templateLD3D extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { // ------------------------------------ preset field ----------- Thread th = null; // for run()-paint() thread Thread thmd = null; // for LD3D() thread LJMolecule ma = new LJMolecule(); LD3D md = new LD3D(ma); DisplayLD3D dsp = new DisplayLD3D(); // for event Choice ch_mat1, ch_mat2, ch_tempControl, 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 dgX,dgY, dgXb,dgYb; int dispMode = 3; int sleepTime = 100; 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.99) tm = 0.99; gOff.setColor(Color.getHSBColor( (float)md.getColor(j),0.8f,(float)(0.8*tm+0.2))); gOff.fillOval(gx-gr/2,gy-gr/2, gr, gr); } } drawWaku(gbx,gby,1); } private double distance(int i,int j) { double x,y,z; x = px[i]-px[j]; y = py[i]-py[j]; z = pz[i]-pz[j]; return Math.sqrt(x*x+y*y+z*z); } private void velocityPlot(int gbx, int gby, double mag) { int i,j,gx,gy,g2x,g2y; double sc,m, p2x,p2y,p2z,rotp2x,rotp2y,rotp2z; setPos(); rotate(); zSort(); drawWaku(gbx,gby,0); sc = dispScale*viewScale; for (i=0; i=xMax/2.0) { gOff.setColor(Color.getHSBColor((float)md.getColor(j),0.8f,(float)(0.2*pz[j]/zDepth+0.5))); } else { gOff.setColor(Color.getHSBColor((float)md.getColor(j),0.4f,(float)(0.2*pz[j]/zDepth+0.5))); } gOff.drawOval(gx-gr/2,gy-gr/2, gr, gr); } drawWaku(gbx,gby,1); } // plot utility private void drawWaku(int gbx, int gby, int imode) { int i,gx,gy,g2x,g2y,farPoint; double sc,tmp; sc = dispScale*viewScale; farPoint = findMin(); for (i=0; i<12; i++) { gx = (int)(sc*pwkx[boxp[i][0]])+gbx; gy = (int)(sc*pwky[boxp[i][0]])+gby; g2x = (int)(sc*pwkx[boxp[i][1]])+gbx; g2y = (int)(sc*pwky[boxp[i][1]])+gby; 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.gray); if (md.getTempMode()==2) { tmp = md.temperature(); if (tmp>md.getContTemp()) { gOff.setColor(Color.black); } else { gOff.setColor(Color.red); } } gOff.drawLine(gx,gy, g2x, g2y); } } } } private int findMin() { int i,im; double m; im = 0; m = pwkz[im]; for (i=0; i<8; i++) { if (pwkz[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 ); } // rotate private void rotate() { int i; for (i=0; i0) { gOff.fillRect(gx+i*2,gy+hoganHight-iy,2,iy); } } 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",gx+40,gy+hoganHight+40); } private void drawHogan(int gx, int gy, int hoganWidth, int hoganHight, int xDiv, int yDiv) { int i; gOff.setColor(Color.gray); for (i=0; i0) { gOff.drawLine(gx+i,gy+200-iy,gx+i,gy+200); } } // Maxwell setMaxwell( md.getContTemp(), mat ); gOff.setColor(Color.getHSBColor(0.01f,0.8f,0.6f)); for (i=0; i<200-1; i++) { iy = (int)(ascale*ffvMaxwell[i]); iy2 = (int)(ascale*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(mat),0.8f,0.6f)); for (i=0; i<200-1; i++) { iy = (int)(ascale*meanvdf[1][i]); iy2 = (int)(ascale*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)(ascale*meanvdf[2][i]); // iy2 = (int)(ascale*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.black); 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); if (mat<21) { gOff.setColor(Color.getHSBColor(md.getColorOf(mat),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 MAT1) { int i,iv,knd; double vv; for (i=0; i<220; i++) { vdf[0][i]=0; vdf[1][i]=0; vdf[2][i]=0; } 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,mr; count = 0; t = 0.0; s = xMax/16.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]; 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]; } } } private void forceCalc() { int i,j,k; double ffr,frz,the,a; double r2,rij,f,fxij,fyij,fzij; a = alpha*Math.sqrt(contTemp); for(i=0;i=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; k0 = (int)(Nsz*(zz[ip]-rreg)/zMax); if (k0<0) k0 = 0; k1 = (int)(Nsz*(zz[ip]+rreg)/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) { r2=(xx[ip]-xx[jp])*(xx[ip]-xx[jp])+(yy[ip]-yy[jp])*(yy[ip]-yy[jp])+(zz[ip]-zz[jp])*(zz[ip]-zz[jp]); 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 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); } public int secMax() { int i,j,k,m; m = 0; for(i=0;im) { m = section[i][j][k][0]; } } } } return(m); } // pressure private void initVirial() { int i; for (i=0; i<256; i++) { virial[0][i] = 0.0; virial[1][i] = 0.0; virial[2][i] = 0.0; memTemp[i] = 0.0; } virialp = 0; } private void setVirial() { int i; double xVir,yVir,zVir; xVir = 0.0; yVir = 0.0; zVir = 0.0; for (i=0; i