/* gas Demixing - FM3D */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2004.04.03 */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class gasDemixing3D extends Applet implements MouseListener, MouseMotionListener, ActionListener, ItemListener, AdjustmentListener, Runnable { /*-------------------------------------- define gloval -----*/ Button bt_open; Choice cm1,cm2; Scrollbar scr,scs; Thread th = null; Dimension dim; Image imgOff; Graphics gOff; int sleepTime = 50; double dispScale = 5.0/3.4e-10; double sgm = 3.4e-10; /* L-J sigma for Ar (m) */ double xMax0 = 40.0*sgm; /* x-Box size in (m) */ double yMax0 = 40.0*sgm; /* y-Box size in (m) */ double zMax0 = 40.0*sgm; /* z-Box size in (m) */ double xMax = xMax0; double yMax = yMax0; double zMax = zMax0; int Nmt = 10*10*10; /* number of molecules */ int NN = Nmt + 1; double t = 0.0; /* time (s) */ double dt = 20.0*1.0e-15; /* time division (s) */ int gate = 1; double volRatio = 1.0; double mol2Ratio = 0.5; int tempMode = 2; double contTemp = 300.0; double scale = 1.0; int dispMode = 3; int dgX, dgY, dgXb,dgYb; double cx = 0.5*xMax; double cy = 0.5*yMax; double cz = 0.5*zMax; double theta = -20.0*3.14/180.0; double fai = 10.0*3.14/180.0; double dtheta = 0.0*3.14/180.0; double pai = 3.1415926536; double rc = 1.0e-9; double rc2 = rc*rc; double rreg = 1.5e-9; double rreg2 = rreg*rreg; double AU = 1.661e-27; double EE = 1.602e-19; double AA = 1.0e-10; double Morse[][] = { /* mass charge D(eV) A(A^-1) r0(A) */ /* 0 W */ {183.85 *AU, 0.0*EE, 0.9906*EE, 1.4116/AA, 3.032*AA}, /* 1 Mo*/ { 95.94 *AU, 0.0*EE, 0.8032*EE, 1.5079/AA, 2.976*AA}, /* 2 Cr*/ { 51.996*AU, 0.0*EE, 0.4414*EE, 1.5721/AA, 2.754*AA}, /* 3 Fe*/ { 55.847*AU, 0.0*EE, 0.4174*EE, 1.3885/AA, 2.845*AA}, /* 4 Ni*/ { 58.71 *AU, 0.0*EE, 0.4205*EE, 1.4199/AA, 2.780*AA}, /* 5 Al*/ { 26.98 *AU, 0.0*EE, 0.2703*EE, 1.1646/AA, 3.253*AA}, /* 6 Pb*/ {207.19 *AU, 0.0*EE, 0.2348*EE, 1.1836/AA, 3.733*AA}, /* 7 Cu*/ { 63.54 *AU, 0.0*EE, 0.3429*EE, 1.3588/AA, 2.866*AA}, /* 8 Ag*/ {107.87 *AU, 0.0*EE, 0.3323*EE, 1.3690/AA, 3.115*AA}, /* 9 Ca*/ { 40.08 *AU, 0.0*EE, 0.1623*EE, 0.8054/AA, 4.569*AA}, /*10 Sr*/ { 87.62 *AU, 0.0*EE, 0.1513*EE, 0.7878/AA, 4.988*AA}, /*11 Ba*/ {137.34 *AU, 0.0*EE, 0.1416*EE, 0.6570/AA, 5.373*AA}, /*12 Na*/ { 22.99 *AU, 0.0*EE, 0.0633*EE, 0.5900/AA, 5.336*AA}, /*13 K */ { 39.102*AU, 0.0*EE, 0.0542*EE, 0.4977/AA, 6.369*AA}, /*14 Rb*/ { 85.47 *AU, 0.0*EE, 0.0464*EE, 0.4298/AA, 7.207*AA}, /*15 Cs*/ {132.905*AU, 0.0*EE, 0.0449*EE, 0.4157/AA, 7.557*AA}, /*16 Ne*/ { 20.183*AU, 0.0*EE, 0.0031*EE, 1.6500/AA, 3.076*AA}, /*17 Ar*/ { 39.948*AU, 0.0*EE, 0.0104*EE, 1.3400/AA, 3.816*AA}, /*18 Kr*/ { 83.80 *AU, 0.0*EE, 0.0141*EE, 1.2500/AA, 4.097*AA}, /*19 Xe*/ {131.30 *AU, 0.0*EE, 0.0200*EE, 1.2400/AA, 4.467*AA}, /*20 Hg*/ {200.59 *AU, 0.0*EE, 0.0734*EE, 1.4900/AA, 3.255*AA} }; int NmatKind = 21; int MAT0 = 20; int MAT1 = 16; int MAT2 = 19; int MAT3 = 9; int MAT4 = 20; int dom[] = new int[NN]; 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 */ double fbx[] = new double[NN]; /* i-th x-force before dt */ double fby[] = new double[NN]; /* i-th y-force before dt */ double fbz[] = new double[NN]; /* i-th z-force before dt */ int reg[][] = new int[NN][860]; /* registration */ int srtz[][] = new int[2][NN]; /* z-sort work space */ int kindT[] = new int[NmatKind]; double forceTable[][][] = new double[5][5][10200]; double hh = 1.0e-13; double px[] = new double[NN]; double py[] = new double[NN]; double pz[] = new double[NN]; double wkx[] = new double[8+4]; double wky[] = new double[8+4]; double wkz[] = new double[8+4]; double pwkx[] = new double[8+4]; double pwky[] = new double[8+4]; double pwkz[] = new double[8+4]; 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}, {8,9},{8,10},{9,11},{10,11} }; /*----------------------------- applet control functions -----*/ public void init() { resize(630,320); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); cm1 = new Choice(); cm1.addItem("Ne"); cm1.addItem("Ar"); cm1.addItem("Kr"); cm1.addItem("Xe"); cm1.addItemListener(this); cm1.select("Ne"); cm2 = new Choice(); cm2.addItem("Ne"); cm2.addItem("Ar"); cm2.addItem("Kr"); cm2.addItem("Xe"); cm2.addItemListener(this); cm2.select("Xe"); scr= new Scrollbar(Scrollbar.HORIZONTAL,300,10,10,510); scr.addAdjustmentListener(this); scs= new Scrollbar(Scrollbar.HORIZONTAL,100,10,50,210); scs.addAdjustmentListener(this); bt_open = new Button("open"); bt_open.addActionListener(this); addMouseListener(this); addMouseMotionListener(this); setLayout(new BorderLayout()); Panel pnl=new Panel(); pnl.setLayout(new GridLayout(1,6,5,0)); pnl.add(cm1); pnl.add(cm2); pnl.add(new Label(" ")); pnl.add(scr); pnl.add(scs); pnl.add(bt_open); add(pnl,"North"); 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 actionPerformed(ActionEvent ev){ if(ev.getSource() == bt_open) { if (gate==1) { t = 0.0; gate = 0; } } } public void itemStateChanged(ItemEvent ev){ if (ev.getSource() == cm1){ MAT1 = 16+cm1.getSelectedIndex(); t = 0.0; setInitialPosition(); } else if (ev.getSource() == cm2){ MAT2 = 16+cm2.getSelectedIndex(); t = 0.0; setInitialPosition(); } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == scr) { contTemp = 1.0*(double)(scr.getValue()); if (tempMode==0 || tempMode==1) { 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,gbz,gb; double sc,sz,tmp,tm,mtm,clr; gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); setWaku(); rotate(theta,fai); zSort(); tmp = temperature(); gbx = 60; gby = 80; sc = dispScale*scale; sz = 2.0*scale/AA; 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 (wkx[farPoint]>xMax/2.0) { for (i=12; i<16; 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 (gate==1) { gOff.setColor(Color.lightGray); } else { if (tmp>contTemp) { gOff.setColor(Color.black); } else { gOff.setColor(Color.red); } } gOff.drawLine(gx,gy, g2x, g2y); } } if (dispMode==0) { for (i=0; i0.99) { tm = 0.99; } gOff.setColor(Color.getHSBColor( (float)clr, 0.99f, (float)tm )); 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); } } if (wkx[farPoint]contTemp) { gOff.setColor(Color.black); } else { gOff.setColor(Color.red); } } gOff.drawLine(gx,gy, g2x, g2y); } } gOff.setColor(Color.black); gOff.drawString("orange",630/6*0+10,40); gOff.drawString("green",630/6*1+10,40); gOff.drawString("T cont="+(int)(contTemp+0.5)+" K",630/6*3+10,40); gOff.drawString("scale="+(int)(scale*100.0+0.5)+"%",630/6*4+10,40); if (gate==1) { gOff.drawString("door=closed",630/6*5+10,40); } else { gOff.drawString("door=open",630/6*5+10,40); } gOff.setColor(Color.blue); gOff.drawString("t="+(int)(t*1.0e13+0.5)/10.0+" ps",630/6*5,60); gOff.drawString("T="+(int)(tmp*10+0.5)/10.0+" K",630/6*3,60); gOff.drawString("L="+(int)(xMax*1.0e10+0.5)/10.0+" nm",630/6*4,60); gOff.setColor(Color.getHSBColor( 0.15f, 0.9f, 0.8f )); gOff.drawString("N(orange)="+nInBox(MAT1)+"",630/6*5,80); gOff.setColor(Color.getHSBColor( 0.33f, 0.9f, 0.8f )); gOff.drawString("N(green)="+nInBox(MAT2)+"",630/6*5,100); } double distance(int j, int jj) { double r2; r2 = (xx[j]-xx[jj])*(xx[j]-xx[jj])+(yy[j]-yy[jj])*(yy[j]-yy[jj])+(zz[j]-zz[jj])*(zz[j]-zz[jj]); return ( Math.sqrt(r2) ); } double ballColor(int knd) { double c; c = 0.0; if (knd==MAT0) { c = 0.01; } else if (knd==MAT1) { c = 0.15; } else if (knd==MAT2) { c = 0.33; } else if (knd==MAT3) { c = 0.66; } else if (knd==MAT4) { c = 0.85; } return ( c ); } /*---------------------------------- 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; } } } } void zSortInit() { int i,j,w; for (i=0; isrtz[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=6000 && ir<10000) { rt = 0.5+0.5*Math.cos(3.1415926536*(((double)ir)/10000.0-0.6)/0.4); } else { rt = 0.0; } return( rt ); } /*-------------------- set initial position ----------*/ void setInitialPosition(){ int i; double s; setForceTable(); gate = 1; t = 0.0; xMax = xMax0; yMax = yMax0; zMax = zMax0; s = xMax/10.0; for (i=0; i1.2){ rr=1.2; }; } for (i=0; i xMax) { if (yy[i]>0.4*yMax && yy[i]<0.6*yMax && zz[i]>0.4*zMax && zz[i]<0.6*zMax && gate==0) { dom[i] = 1; } else { 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]; } } else if (dom[i]==1) { if (xx[i] < xMax) { xx[i] = xMax; vx[i] = -rr*vx[i]; vy[i] = rr*vy[i]; vz[i] = rr*vz[i]; } } } } void forceCalc() { int i,j,k; double r2,rij,f,fxij,fyij,fzij; for(i=0;i