/** applet No. 019 * * template - Morse potential - molecular dynamics 2D * * Created by Ikeuchi Mitsuru on July 20 2002. * Copyright (c) 2002-2007 Ikeuchi Mitsuru. All rights reserved. * * ver 0.0.1 2002.07.20 created * ver 0.0.2 2002.08.09 Morse potential (Di+Dj)/2 -> sqrt(Di*Dj) * ver 0.0.3 2002.12.11 add Hg * ver 0.0.4 2003.03.25 display nois reduced * ver 0.0.5 2003.07.17 improved in memory saving * ver 0.0.6 2003.11.15 add temp. control mode * ver 0.0.7 2004.02.04 improved pannel layout * ver 0.0.8 2004.06.02 improved verlet code * ver 0.0.9 2007.05.04 improved code * ver 0.1.0 2007.05.12 added setBoundary() * ver 0.1.1 2007.05.18 improved code * ver 0.1.2 2007.06.26 improved code * */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class Morse2D extends Applet implements ItemListener, ActionListener, AdjustmentListener, Runnable { // ------------------------------------ preset field ----------- Thread th = null; // for run()-paint() thread // for event Choice ch_mat1, ch_mat2, ch_tempCont, ch_view; Button bt_reset, bt_startStop; Scrollbar sc_temp; // for off-paint buffer Dimension dim; Image imgOff; Graphics gOff; // MD2D double t = 0.0; // time (s) double dt = 5.0*1.0e-15; // time division (s) double xMax = 6.0e-9; // x-Box size (m) double yMax = 6.0e-9; // y-Box size (m) int tempMode = 2; // 0-adiabatic 1-scaling 2-wall cont double contTemp = 300.0; // control temperature (K) int resetSW = 0; int startSW = 1; int Nmt = 36; // number of molecules double AU = 1.661e-27; double EE = 1.602e-19; double AA = 1.0e-10; double Morse[][] = { // 0:mass 1:charge 2:D(eV) 3:A(A^-1) 4:r0(A) 5:color { 183.85 *AU, 0.0*EE, 0.9906*EE, 1.4116/AA, 3.032*AA, 0.30 }, // 0 W { 95.94 *AU, 0.0*EE, 0.8032*EE, 1.5079/AA, 2.976*AA, 0.33 }, // 1 Mo { 51.996*AU, 0.0*EE, 0.4414*EE, 1.5721/AA, 2.754*AA, 0.36 }, // 2 Cr { 55.847*AU, 0.0*EE, 0.4174*EE, 1.3885/AA, 2.845*AA, 0.39 }, // 3 Fe { 58.71 *AU, 0.0*EE, 0.4205*EE, 1.4199/AA, 2.780*AA, 0.42 }, // 4 Ni { 26.98 *AU, 0.0*EE, 0.2703*EE, 1.1646/AA, 3.253*AA, 0.45 }, // 5 Al { 207.19 *AU, 0.0*EE, 0.2348*EE, 1.1836/AA, 3.733*AA, 0.48 }, // 6 Pb { 63.54 *AU, 0.0*EE, 0.3429*EE, 1.3588/AA, 2.866*AA, 0.20 }, // 7 Cu { 107.87 *AU, 0.0*EE, 0.3323*EE, 1.3690/AA, 3.115*AA, 0.24 }, // 8 Ag { 40.08 *AU, 0.0*EE, 0.1623*EE, 0.8054/AA, 4.569*AA, 0.13 }, // 9 Ca { 87.62 *AU, 0.0*EE, 0.1513*EE, 0.7878/AA, 4.988*AA, 0.16 }, // 10 Sr { 137.34 *AU, 0.0*EE, 0.1416*EE, 0.6570/AA, 5.373*AA, 0.19 }, // 11 Ba { 22.99 *AU, 0.0*EE, 0.0633*EE, 0.5900/AA, 5.336*AA, 0.01 }, // 12 Na { 39.102*AU, 0.0*EE, 0.0542*EE, 0.4977/AA, 6.369*AA, 0.04 }, // 13 K { 85.47 *AU, 0.0*EE, 0.0464*EE, 0.4298/AA, 7.207*AA, 0.07 }, // 14 Rb { 132.905*AU, 0.0*EE, 0.0449*EE, 0.4157/AA, 7.557*AA, 0.10 }, // 15 Cs { 20.183*AU, 0.0*EE, 0.0031*EE, 1.6500/AA, 3.076*AA, 0.56 }, // 16 Ne { 39.948*AU, 0.0*EE, 0.0104*EE, 1.3400/AA, 3.816*AA, 0.60 }, // 17 Ar { 83.80 *AU, 0.0*EE, 0.0141*EE, 1.2500/AA, 4.097*AA, 0.64 }, // 18 Kr { 131.30 *AU, 0.0*EE, 0.0200*EE, 1.2400/AA, 4.467*AA, 0.68 }, // 19 Xe { 200.59 *AU, 0.0*EE, 0.0734*EE, 1.4900/AA, 3.255*AA, 0.72 } // 20 Hg }; String material[] = { "W" ,"Mo","Cr","Fe","Ni","Al","Pb","Cu","Ag","Ca", "Sr","Ba","Na","K" ,"Rb","Cs","Ne","Ar","Kr","Xe","Hg" }; int NmatKind = 21; double MorseD[][] = new double[NmatKind][NmatKind]; double MorseA[][] = new double[NmatKind][NmatKind]; double Morser0[][] = new double[NmatKind][NmatKind]; int MAT1 = 5; // Al int MAT2 = 0; int NN = Nmt; int kind[] = new int[NN]; // i-th particle kind double xx[] = new double[NN]; // i-th x-position double yy[] = new double[NN]; // i-th y-position double vx[] = new double[NN]; // i-th x-velocity double vy[] = new double[NN]; // i-th y-velocity double ffx[] = new double[NN]; // i-th x-force double ffy[] = new double[NN]; // i-th y-force // display int sleepTime = 30; // sleep time (ms) int dispWidth = 630; int dispHeight = 460; int dispMode = 0; double boxDispWidth = 320.0; double dispScale = (boxDispWidth/xMax); double viewScale = 1.0; // ------------------------------ applet main thread ----------- public void init() { resize(dispWidth,dispHeight); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); ch_mat1 = new Choice(); for (int i=0; i0.66) col = 0.66; gOff.setColor(Color.getHSBColor((float)col,0.8f,0.8f )); gOff.drawLine(ix,iy, jx,jy); } } gOff.setColor(Color.getHSBColor((float)(Morse[kind[i]][5]),0.9f,0.6f )); gOff.fillOval(ix-ir/2,iy-ir/2, ir, ir); } } private double rsquare(int i, int j) { double x,y; x = xx[i] - xx[j]; y = yy[i] - yy[j]; return x*x+y*y; } private void velocityPlot(int gbx, int gby, double sc, double mag) { int i, ix,iy,ir, ix2,iy2, ballSize; drawBox(gbx, gby, sc); gOff.setColor(Color.blue); 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]; } } } // --------------------------------------- utilities ----------- private double temperature() { int i; double s; s = 0.0; for (i=0; i