/* template - express SX1S potential */ /* 100 SiO2 + 30 Na2O + 60 CaO */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2005.01.29 */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class templateESX extends Applet implements MouseListener, MouseMotionListener, ItemListener, AdjustmentListener, Runnable { /*-------------------------------------- define gloval -----*/ Choice ctc,cvw; Scrollbar scr,scs; Thread th = null; Dimension dim; Image imgOff; Graphics gOff; int sleepTime = 50; double sgm = 3.4e-10; /* L-J sigma for Ar (m) */ double dispScale = 20.0/sgm; double xMax = 10.0*sgm; /* x-Box size in (m) */ double yMax = 10.0*sgm; /* y-Box size in (m) */ double zMax = 10.0*sgm; /* z-Box size in (m) */ int Nmt = 510; /* number of molecules */ int NN = Nmt + 1; double t = 0.0; /* time (s) */ double dt = 1.0*1.0e-15; /* time division (s) */ int Nsx = 5; /* xMax/2.0sgm */ int Nsy = 5; /* yMax/2.0sgm */ int Nsz = 5; /* zMax/2.0sgm */ int tempMode = 2; double contTemp = 2000.0; double scale = 1.0; int dispMode = 2; double rc = 1.0e-9; double rc2 = rc*rc; int dgX, dgY, dgXb,dgYb; double cx = 0.5*xMax; double cy = 0.5*yMax; double cz = 0.5*zMax; double theta = -10.0*3.14/180.0; double fai = 5.0*3.14/180.0; double pai = 3.1415926536; double AU = 1.661e-27; double EE = 1.602e-19; double AA = 1.0e-10; double eForceConst = 1.0/(4.0*3.1416*8.8542e-12); double SXdata[][] = { /* 0 M , 1 z , 2 a , 3 b , 4 c , 5 r */ /* 0 B */ { 10.81*AU, 3.0*EE, 0.720*AA, 0.080*AA, 0.0, 0.23 }, /* 1 O */ { 16.00*AU, -2.0*EE, 1.626*AA, 0.085*AA, 20.0, 1.40 }, /* 2 F */ { 19.00*AU, -1.0*EE, 1.565*AA, 0.085*AA, 20.0, 1.33 }, /* 3 Na */ { 22.99*AU, 1.0*EE, 1.260*AA, 0.080*AA, 20.0, 1.02 }, /* 4 Mg */ { 24.31*AU, 2.0*EE, 1.161*AA, 0.080*AA, 10.0, 0.72 }, /* 5 Al */ { 26.98*AU, 3.0*EE, 1.064*AA, 0.080*AA, 2.0, 0.53 }, /* 6 Si */ { 28.09*AU, 4.0*EE, 1.012*AA, 0.080*AA, 0.0, 0.40 }, /* 7 Cl */ { 35.45*AU, -1.0*EE, 1.950*AA, 0.090*AA, 30.0, 1.81 }, /* 8 K */ { 39.10*AU, 1.0*EE, 1.595*AA, 0.080*AA, 15.0, 1.38 }, /* 9 Ca */ { 40.08*AU, 2.0*EE, 1.414*AA, 0.080*AA, 10.0, 1.00 }, /*10 Ti */ { 47.88*AU, 4.0*EE, 1.235*AA, 0.080*AA, 0.0, 0.61 }, /*11 Sr */ { 87.62*AU, 2.0*EE, 1.632*AA, 0.080*AA, 15.0, 1.16 }, /*12 Ba */ { 137.3*AU, 2.0*EE, 1.820*AA, 0.080*AA, 20.0, 1.36 } }; int NmatKind = 13; double SXa[][] = new double[NmatKind][NmatKind]; double SXb[][] = new double[NmatKind][NmatKind]; double SXc[][] = new double[NmatKind][NmatKind]; int MAT0 = 6; /* Si */ int MAT1 = 1; /* O */ int MAT2 = 3; /* Na */ int MAT3 = 9; /* Ca */ int MAT4 = 7; /* Cl */ int kindT[] = new int[NmatKind]; double forceTable[][][] = new double[5][5][1200]; int kind[] = new int[NN]; /* i-th molec kind */ double xx[] = new double[NN]; /* i-th x-position */ double yy[] = new double[NN]; /* i-th y-position */ double zz[] = new double[NN]; /* i-th z-position */ double vx[] = new double[NN]; /* i-th x-velocity */ double vy[] = new double[NN]; /* i-th y-velocity */ double vz[] = new double[NN]; /* i-th z-velocity */ double ffx[] = new double[NN]; /* i-th x-force */ double ffy[] = new double[NN]; /* i-th y-force */ double ffz[] = new double[NN]; /* i-th z-force */ int reg[][] = new int[NN][300]; /* registration */ int section[][][][] = new int[Nsx][Nsy][Nsz][100]; int srtz[][] = new int[2][NN]; /* z-sort work space */ int rdf[][] = new int[4][120]; double virial[] = new double[256]; int virialp = 0; double px[] = new double[NN]; double py[] = new double[NN]; double pz[] = new double[NN]; double wkx[] = new double[8]; double wky[] = new double[8]; double wkz[] = new double[8]; double pwkx[] = new double[8]; double pwky[] = new double[8]; double pwkz[] = new double[8]; int boxp[][] = { {0,1},{0,2},{0,4},{1,3},{1,5},{2,3},{2,6},{4,5},{4,6},{3,7},{5,7},{6,7} }; /*----------------------------- applet control functions -----*/ public void init() { resize(630,320); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); ctc = new Choice(); ctc.addItem("adiabatic"); ctc.addItem("T scaling"); ctc.addItem("wall cont."); ctc.addItemListener(this); ctc.select("wall cont."); cvw = new Choice(); cvw.addItem("ball"); cvw.addItem("line"); cvw.addItem("both"); cvw.addItem("real"); cvw.addItem("temp"); cvw.addItemListener(this); cvw.select("both"); scr= new Scrollbar(Scrollbar.HORIZONTAL,200,10,10,410); scr.addAdjustmentListener(this); scs= new Scrollbar(Scrollbar.HORIZONTAL,100,10,50,210); scs.addAdjustmentListener(this); addMouseListener(this); addMouseMotionListener(this); setLayout(new BorderLayout()); Panel pnl = new Panel(); pnl.setLayout(new GridLayout(1,6,5,0)); pnl.add(new Label(" ")); pnl.add(ctc); pnl.add(scr); pnl.add(new Label(" ")); pnl.add(cvw); pnl.add(scs); add(pnl,"North"); setSX(); setInitialPosition(); setWaku(); } public void start() { if (th == null) { th = new Thread(this); th.start(); } } public void stop() { if (th != null) { th.stop(); th = null; } } public void itemStateChanged(ItemEvent ev){ if (ev.getSource() == ctc) { tempMode = ctc.getSelectedIndex(); repaint(); } else if (ev.getSource() == cvw){ dispMode = cvw.getSelectedIndex(); repaint(); } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == scr) { contTemp = 10.0*(double)(scr.getValue()); vAjustment(); } else if(ev.getSource() == scs) { scale = 0.01*(double)(scs.getValue()); } } public void mousePressed(MouseEvent ev){ } public void mouseReleased(MouseEvent ev){ dgXb = 0; dgYb = 0; dgX = 0; dgY = 0; } public void mouseClicked(MouseEvent ev){ } public void mouseEntered(MouseEvent ev){ } public void mouseExited (MouseEvent ev){ } public void mouseMoved (MouseEvent ev){ } public void mouseDragged(MouseEvent ev){ dgXb = dgX; dgYb = dgY; dgX=ev.getX(); dgY=ev.getY(); if (dgXb==0 && dgYb==0) { dgXb = dgX; dgYb = dgY; } theta += 0.5*3.14/180.0*(dgX-dgXb); fai += 0.5*3.14/180.0*(dgY-dgYb); } public void run() { while (th != null) { try { calcposition(); offPaint(); repaint(); Thread.sleep(sleepTime); } catch (InterruptedException e) { } } } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { g.drawImage(imgOff,0,0,this); } /* ----------------------------- offPaint -------------------- */ void offPaint() { int i,j,k,jj,farPoint; int gx,gy,gz,g2x,g2y,gbx,gby,gb; double sc,sz,tmp,clr,tm; gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); rotate(theta,fai); zSort(); tmp = temperature(); setRadialDistribution(); gbx = 60; gby = 80; sc = dispScale*scale; sz = 1.0*sc*1.0e-10*scale; 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 (boxp[i][0]==farPoint || boxp[i][1]==farPoint) { gOff.setColor(Color.lightGray); gOff.drawLine(gx,gy, g2x, g2y); } } if (dispMode==0) { for (i=0; i1.0) { tm = 1.0; } clr = colorOf(kind[j]); gOff.setColor(Color.getHSBColor((float)clr,0.95f,(float)(0.8*tm+0.2))); gOff.fillOval(gx-gz/2,gy-gz/2, gz, gz); } } 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 (boxp[i][0]!=farPoint && boxp[i][1]!=farPoint) { gOff.setColor(Color.gray); if (tempMode==2) { if (tmp>contTemp) { gOff.setColor(Color.black); } else { gOff.setColor(Color.red); } } gOff.drawLine(gx,gy, g2x, g2y); } } gbx = 400; gby = 80; gOff.setColor(Color.gray); for (i=0; i<100; i+=20) { gOff.drawLine(gbx+i,gby, gbx+i, gby+200); } gOff.drawLine(gbx,gby+100, gbx+100, gby+100); gOff.setColor(Color.black); gOff.drawRect(gbx,gby,100,200); gOff.drawString("0",gbx-5,gby+215); gOff.drawString("5 A",gbx+90,gby+215); gOff.setColor(Color.cyan); for (i=0; i<100; i++) { if (rdf[0][i]>0) { gOff.drawLine(gbx+i,gby+200-rdf[0][i], gbx+i, gby+200); } } gOff.setColor(Color.black); gOff.drawString("temp control",630/6*1+10,40); gOff.drawString("cont T="+contTemp+"K",630/6*2+10,40); gOff.drawString("view",630/6*4+10,40); gOff.drawString("scale="+(int)(scale*100.0+0.499)+"%",630/6*5+10,40); gb = 630/6*5; gOff.setColor(Color.black); gOff.drawString("size="+marume(xMax*1.0e9)+" nm",gb,70); gOff.setColor(Color.blue); gOff.drawString("t="+Math.floor(t*1.0e15)+"(fs)",gb,110); gOff.drawString("T="+temperature()+" K",gb,130); gOff.drawString("P="+(int)(pressure()/1.0e6)+"MPa",gb,150); gOff.setColor(Color.red); gOff.drawString("red = Si++++",gb,190); gOff.setColor(Color.orange); gOff.drawString("orange = Ca++",gb,210); gOff.setColor(Color.blue); gOff.drawString("blue = O--",gb,230); gOff.setColor(Color.green); gOff.drawString("green = Na+",gb,250); /* gOff.setColor(Color.black); gOff.drawString("reg max="+regMax()+" ",gb,270); gOff.drawString("sec max="+secMax()+" ",gb,290); */ } double colorOf(int knd) { double c; c = 0.0; if (knd==MAT0) { c = 0.01; } else if (knd==MAT1) { c = 0.66; } else if (knd==MAT2) { c = 0.33; } else if (knd==MAT3) { c = 0.13; } return ( c ); } double distance(int i,int j) { double x,y,z; x = xx[i]-xx[j]; y = yy[i]-yy[j]; z = zz[i]-zz[j]; return(Math.sqrt(x*x+y*y+z*z)); } double marume(double x) { return(Math.floor(x*100.0)/100.0); } int regMax() { int i,m; m = 0; for(i=0;im) { m = reg[i][0]; } } return(m); } int secMax() { int i,j,k,m; m = 0; for(i=0;im) { m = section[i][j][k][0]; } } } } return(m); } /*---------------------------------- findMin() ----------*/ int findMin() { int i,im; double m; im = 0; m = pwkz[im]; for (i=0; i<8; i++) { if (pwkz[i]srtz[1][j+1]) { w = srtz[0][j]; srtz[0][j]=srtz[0][j+1]; srtz[0][j+1]=w; w = srtz[1][j]; srtz[1][j]=srtz[1][j+1]; srtz[1][j+1]=w; } } } } /*------------------------------------- rotate ----------*/ void rotate(double th,double fi) { int i; double cosTh,sinTh,cosFi,sinFi; cosTh = Math.cos(th); sinTh = Math.sin(th); cosFi = Math.cos(fi); sinFi = Math.sin(fi); for (i=0; i=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 ); } /*---------------------- set initial condition ---------*/ void setInitialPosition(){ int i,ix,iy,iz,nb,nb2,j,k,iw; int nSi,nO,nNa,nCa; double a; kindT[MAT0] = 0; kindT[MAT1] = 1; kindT[MAT2] = 2; kindT[MAT3] = 3; kindT[MAT4] = 4; setForceTable(); nSi = 100; nO = 290; nNa = 60; nCa = 60; for (i=0; i=nO && i=nO+nSi && i=nO+nSi+nNa && 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; } } /*------------------------------- molecules motion ---------*/ void calcposition(){ int i; if (tempMode==1 || t<200.0*dt) { vAjustment(); } registration(); for (i=0; i<10; i++) { timeEvolution(); } setVirial(); } void timeEvolution(){ int i; double dtv2, a2, rr,tmp; dtv2 = dt/2.0; t = t + dt; rr = 1.0; if (tempMode==2) { tmp = temperature(); rr = Math.sqrt(contTemp/tmp); if (rr<0.5) { rr = 0.5; } else if (rr>1.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]; } } } void forceCalc() { int i,j,k; double xi,xj,yi,yj,zi,zj; double r2,rij,f,fxij,fyij,fzij; for(i=0;i