/** applet No. 1164 * * jellium Slab * - y,z-periodic - external charge density - real space DFT-LDA * jellium(Z=36) - electron 36 system * LDA: J. P. Perdew and A. Zunger; Phys. Rev., B23, 5048 (1981) * - multi thread ECD :: display - asynchronous * * Created by Ikeuchi Mitsuru on April 28 2007. * Copyright (c) 2007 Ikeuchi Mitsuru. All rights reserved. * * ver 0.0.1 2007.04.28 created * ver 0.0.2 2007.06.23 improved code * */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class jelliumSlabMtPECD extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { // ------------------------------------ preset field ----------- Thread th = null; // for run()-paint() thread RSDFTPyzECD rs = null; DrawGraph3d dg3d = new DrawGraph3d(); // for event Choice ch_noe, ch_view; Button bt_reset, bt_startStop, bt_step; Scrollbar sc_mixing, sc_broadening, sc_orbit, sc_kPos; // for off-paint buffer Dimension dim; Image imgOff; Graphics gOff; int dgX, dgY, dgXb,dgYb; // mouse int sleepTime = 50; int dispMode = 9; 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_noe = new Choice(); ch_noe.add("ne=Z-1");ch_noe.add("ne=Z-0.5"); ch_noe.add("ne=Z");ch_noe.add("ne=Z+0.5"); ch_noe.add("ne=Z+1"); ch_noe.addItemListener(this); ch_noe.select("ne=Z"); ch_view = new Choice(); ch_view.add("orbit dens");ch_view.add("orbit phase"); ch_view.add("ph-grid");ch_view.add("Vext/4"); ch_view.add("VH/4"); ch_view.add("Vx"); ch_view.add("Vc"); ch_view.add("Veff"); ch_view.add("rho");ch_view.add("rho 3D"); ch_view.add("rho /zPos"); ch_view.add("rho+charge"); ch_view.addItemListener(this); ch_view.select("rho 3D"); bt_reset = new Button("reset"); bt_reset.addActionListener(this); bt_startStop = new Button("start/stop"); bt_startStop.addActionListener(this); bt_step = new Button("step"); bt_step.addActionListener(this); sc_mixing = new Scrollbar(Scrollbar.HORIZONTAL,20,10,1,100); sc_mixing.addAdjustmentListener(this); sc_broadening = new Scrollbar(Scrollbar.HORIZONTAL,1,10,1,110); sc_broadening.addAdjustmentListener(this); sc_orbit = new Scrollbar(Scrollbar.HORIZONTAL,17,10,0,rs.Nstate+10-1); sc_orbit.addAdjustmentListener(this); sc_kPos = new Scrollbar(Scrollbar.HORIZONTAL,rs.NNz/2,10,0,rs.NNz+10-1); sc_kPos.addAdjustmentListener(this); addMouseListener(this); addMouseMotionListener(this); setLayout(new BorderLayout()); Panel pnl = new Panel(); pnl.setLayout(new GridLayout(2,6,5,0)); //pnl.add(new Label(" ")); pnl.add(bt_reset); pnl.add(bt_startStop); pnl.add(bt_step); pnl.add(new Label(" ")); pnl.add(new Label(" view")); pnl.add(ch_view); pnl.add(new Label(" ")); pnl.add(ch_noe); pnl.add(sc_mixing); pnl.add(sc_broadening); pnl.add(sc_orbit); pnl.add(sc_kPos); add(pnl,"North"); } public void start() { if (rs == null) { rs = new RSDFTPyzECD(); rs.start(); } if (th == null) { th = new Thread(this); th.start(); } } public void stop() { if (th != null) th = null; if (rs != null) rs = null; } // ---------------------------------- event listener ----------- public void itemStateChanged(ItemEvent ev) { double zz,ne; if (ev.getSource() == ch_noe){ ne = rs.getNuclearCarge() - 1.0 + 0.5*ch_noe.getSelectedIndex(); rs.setNumberOfElectron(ne); } else if (ev.getSource() == ch_view){ dispMode = ch_view.getSelectedIndex(); } } public void actionPerformed(ActionEvent ev){ if(ev.getSource() == bt_reset){ rs.reset(); } else if (ev.getSource() == bt_startStop){ if (rs.getStartSW()==0) { rs.setStartSW(1); } else { rs.setStartSW(0); } } else if (ev.getSource() == bt_step){ if (rs.getStartSW()==0) { rs.setStepSW(); } } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == sc_broadening) { rs.setBroadening( 0.001*sc_broadening.getValue() ); } else if (ev.getSource() == sc_mixing) { rs.setMixing( 0.01*(double)(sc_mixing.getValue()) ); } else if (ev.getSource() == sc_orbit) { dg3d.setDispObj( sc_orbit.getValue() ); } else if (ev.getSource() == sc_kPos) { dg3d.setkPos( sc_kPos.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; } dg3d.setViewDelta( (dgX-dgXb), (dgY-dgYb) ); } // ========================= run() - paint() loop ============== public void run() { while (th != null) { thCount += 1; offPaint(); repaint(); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { } } } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { g.drawImage(imgOff,0,0,this); } public void offPaint() { if (rs != null) { dg3d.plotGraph(gOff, rs, dispMode, thCount); } } } // =============================== draw graph 3d class =========== class DrawGraph3d { private Graphics gOff; private RSDFTPyzECD rs; private int NNx = rs.NNx; private int NNy = rs.NNy; private int NNz = rs.NNz; private double dx = rs.dx; private double dy = rs.dy; private double dz = rs.dz; private int Nstate = rs.Nstate; private double xMax = NNx*dx; private double yMax = NNy*dy; private double zMax = NNz*dz; private double cxx = xMax/2.0; private double cyy = yMax/2.0; private double czz = zMax/2.0; private double dispScale = 300.0/xMax; private double viewScale = 1.0; private double scale = dispScale*viewScale; private int xImageLoc = 50; private int yImageLoc = 120; private int kPos = NNz/2; private int dispObj = 17; private double viewTheta = -15.0*3.14/180.0; private double viewFai = -72.0*3.14/180.0; private double cosTh = Math.cos(viewTheta); private double sinTh = Math.sin(viewTheta); private double cosFi = Math.cos(viewFai); private double sinFi = Math.sin(viewFai); private double wkx[] = new double[8]; private double wky[] = new double[8]; private double wkz[] = new double[8]; private double pwkx[] = new double[8]; private double pwky[] = new double[8]; private double pwkz[] = new double[8]; private 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} }; private int xpts[] = new int[500]; private int ypts[] = new int[500]; private int drawnCount = 0; // ------------------------------- class constructor ----------- DrawGraph3d() { } // ----------------------------------- class methods ----------- public void plotGraph(Graphics gg, RSDFTPyzECD rsdft, int dispMode, int thCount) { int rsCount,gb,i; gOff = gg; rs = rsdft; if (rs==null) return; rsCount = rs.getCount(); //if (rsCount==drawnCount) return; //drawnCount = rsCount; gOff.setColor(Color.white); gOff.fillRect(0,0,630,460); if (dispMode==0) { densityInterPlot( 2, dispObj, 0); } else if (dispMode==1) { densityInterPlot( 3, dispObj, 0); } else if (dispMode==2) { gridFnPlot(rs.getOrbit(dispObj), 20.0); } else if (dispMode==3) { gridFnPlot(rs.getVext(), 0.25); } else if (dispMode==4) { gridFnPlot(rs.getVh(), 0.25); } else if (dispMode==5) { gridFnPlot(rs.getVx(), 1.0); } else if (dispMode==6) { gridFnPlot(rs.getVc(), 1.0); } else if (dispMode==7) { gridFnPlot(rs.getV(), 1.0); } else if (dispMode==8) { gridFnPlot(rs.getDensity(), 1.0); } else if (dispMode==9) { densityInterPlot(0, dispObj, 0); } else if (dispMode==10) { densityInterPlot(1, dispObj, 0); } else if (dispMode==11) { densityInterPlot(0, dispObj ,1); } gOff.setColor(Color.black); gOff.drawString("Z="+rs.getNuclearCarge()+" ",630/6*0+10,70); gOff.drawString("ne="+rs.getNumberOfElectron()+" ",630/6*1+20,70); gOff.drawString("mix="+(int)(rs.getMixing()*100+0.5)/100.0+" ",630/6*2+10,70); gOff.drawString("kT0="+(int)(rs.getkT0()*1000+0.5)/1000.0+" ",630/6*3+10,70); gOff.drawString("orbit="+dispObj+" ",630/6*4+10,70); gOff.drawString("zPos="+kPos+" ",630/6*5+20,70); gOff.drawString("W slab",10,90); gb = 400; gOff.setColor(Color.black); gOff.drawString("kT="+(int)(rs.getkT()*1000.0+0.5)/1000.0+" ",gb,90); gOff.drawString("iteration="+rs.getCount()+" ",gb+120,90); gOff.drawString("box="+(int)(rs.NNx*rs.dx)+"x"+ +(int)(rs.NNy*rs.dy)+"x"+(int)(rs.NNz*rs.dz)+" au",gb,110); gOff.drawString("dx="+(int)(dx*100.0)/100.0+" au",gb+120,110); gOff.drawString("total energy="+(float)rs.getTotalEnergy()+" au",gb,130); dispTable(gb, 150); } private void dispTable(int gx, int gy) { int i,i0,gyi; gOff.setColor(Color.black); gOff.drawString("No.",gx,gy); gOff.drawString("occupation",gx+30,gy); gOff.drawString("energy",gx+150,gy); i0 = dispObj-10; if (i0<0) i0 = 0; if (i0+20>Nstate) i0 = Nstate - 20; for (i=i0; i10.0) { iBegin = NNx-1; iEnd = 0; iInc = -1; } jBegin = 0; jEnd = NNy; jInc = 1; if (wky[fp]>10.0) { jBegin = NNy-1; jEnd = 0; jInc = -1; } kBegin = 0; kEnd = NNz; kInc = 1; if (wkz[fp]>10.0) { kBegin = NNz-1; kEnd = 0; kInc = -1; } for (i=iBegin; ((i0) || (i>=iEnd && iInc<0)) ; i += iInc) { x = dx*i; for (j=jBegin; ((j0) || (j>=jEnd && jInc<0)) ; j += jInc) { y = dy*j; for (k=kBegin; ((k0) || (k>=kEnd && kInc<0)) ; k += kInc) { z = dz*k; dens = 0.0; if (mode<=1) { dens = 1.0*ptr[i][j][k]; if (dens>0.999) dens = 0.999; gOff.setColor(Color.getHSBColor((float)(0.66-0.66*dens), 0.9f,0.9f)); if (mode==1 && k>kPos) dens = 0.0; } else if (mode==2) { dens = 5.0*ptr[i][j][k]*ptr[i][j][k]; if (dens>0.999) dens = 0.999; gOff.setColor(Color.getHSBColor((float)(0.66-0.66*dens), orbden,0.9f)); } else if (mode==3) { dens = 5.0*ptr[i][j][k]*ptr[i][j][k]; if (dens>0.999) dens = 0.999; if (ptr[i][j][k]>0.0) { gOff.setColor(Color.getHSBColor(0.33f, orbden,0.9f)); } else { gOff.setColor(Color.getHSBColor(0.01f, orbden,0.9f)); } } ir = (int)(10.0*dens+0.98); if (ir>0) { ppy = cosFi*(y-cyy)+sinFi*(z-czz) + cyy; ppz = -sinFi*(y-cyy)+cosFi*(z-czz) + czz; ppx = cosTh*(x-cxx)+sinTh*(ppz-czz) + cxx; ppz = -sinTh*(x-cxx)+cosTh*(ppz-czz) + czz; ix = (int)(scale*ppx)+xImageLoc; iy = (int)(scale*ppy)+yImageLoc; gOff.fillOval(ix-ir/2,iy-ir/2,ir,ir); } } } } drawBox(1); } private void densityInterPlot(int mode, int orbit, int nuc) { int i,j,k,ix,iy,ir,fp, ii,im, jj,jm, kk,km; int iBegin, iEnd, iInc, jBegin, jEnd, jInc, kBegin, kEnd, kInc; float orbden; double x,y,z,ppx,ppy,ppz,dens,d; double[][][] ptr, rhoExt; ptr = rs.getOrbit(orbit); rhoExt = rs.getrhoExt(); if (mode<=1) ptr = rs.getDensity(); orbden = (float)(0.3+0.3*rs.getOccupation(orbit)); fp = drawBox(0); iBegin = 0; iEnd = 2*NNx-1; iInc = 1; if (wkx[fp]>10.0) { iBegin = 2*NNx-2; iEnd = 0; iInc = -1; } jBegin = 0; jEnd = 2*NNy-1; jInc = 1; if (wky[fp]>10.0) { jBegin = 2*NNy-2; jEnd = 0; jInc = -1; } kBegin = 0; kEnd = 2*NNz-1; kInc = 1; if (wkz[fp]>10.0) { kBegin = 2*NNz-2; kEnd = 0; kInc = -1; } for (i=iBegin; ((i0) || (i>=iEnd && iInc<0)) ; i += iInc) { x = 0.5*dx*i; ii = i/2; im = i/2+i%2; for (j=jBegin; ((j0) || (j>=jEnd && jInc<0)) ; j += jInc) { y = 0.5*dy*j; jj = j/2; jm = j/2+j%2; for (k=kBegin; ((k0) || (k>=kEnd && kInc<0)) ; k += kInc) { z = 0.5*dz*k; kk = k/2; km = k/2+k%2; d = ptr[ii][jj][kk]+ptr[im][jj][kk]+ptr[ii][jm][kk]+ptr[ii][jj][km] +ptr[im][jm][kk]+ptr[im][jj][km]+ptr[ii][jm][km]+ptr[im][jm][km]; dens = 0.0; if (mode<=1) { dens = 0.125*d; if (dens>0.999) dens = 0.999; gOff.setColor(Color.getHSBColor((float)(0.66-0.66*dens), 0.9f,0.9f)); if (mode==1 && k>2*kPos) dens = 0.0; } else if (mode==2) { dens = 5.0*0.125*d*d; if (dens>0.999) dens = 0.999; gOff.setColor(Color.getHSBColor((float)(0.66-0.66*dens), orbden,0.9f)); } else if (mode==3) { dens = 5.0*0.125*d*d; if (dens>0.999) dens = 0.999; if (d>0.0) { gOff.setColor(Color.getHSBColor(0.33f, orbden,0.9f)); } else { gOff.setColor(Color.getHSBColor(0.01f, orbden,0.9f)); } } ir = (int)(10.0*dens+0.98); if (ir>0) { ppy = cosFi*(y-cyy)+sinFi*(z-czz) + cyy; ppz = -sinFi*(y-cyy)+cosFi*(z-czz) + czz; ppx = cosTh*(x-cxx)+sinTh*(ppz-czz) + cxx; ppz = -sinTh*(x-cxx)+cosTh*(ppz-czz) + czz; ix = (int)(scale*ppx)+xImageLoc; iy = (int)(scale*ppy)+yImageLoc; gOff.fillOval(ix-ir/2,iy-ir/2,ir,ir); } if (nuc==1) { if (i%2==0 && j%2==0 && k%2==0 && (rhoExt[ii][jj][kk]<0.0)) { ppy = cosFi*(y-cyy)+sinFi*(z-czz) + cyy; ppz = -sinFi*(y-cyy)+cosFi*(z-czz) + czz; ppx = cosTh*(x-cxx)+sinTh*(ppz-czz) + cxx; ppz = -sinTh*(x-cxx)+cosTh*(ppz-czz) + czz; ix = (int)(scale*ppx)+xImageLoc; iy = (int)(scale*ppy)+yImageLoc; ir = 3; gOff.setColor(Color.getHSBColor(0.85f, 0.9f,0.9f)); gOff.fillOval(ix-ir/2,iy-ir/2,ir,ir); } } } } } drawBox(1); } // draw box private int drawBox(int imode) { int i,gx,gy,g2x,g2y,farPoint; double sc; if (imode==0) { setBox(); rotateBox(); } sc = dispScale*viewScale; farPoint = findFarPoint(); for (i=0; i<12; i++) { gx = (int)(sc*pwkx[boxp[i][0]])+xImageLoc; gy = (int)(sc*pwky[boxp[i][0]])+yImageLoc; g2x = (int)(sc*pwkx[boxp[i][1]])+xImageLoc; g2y = (int)(sc*pwky[boxp[i][1]])+yImageLoc; 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.darkGray); gOff.drawLine(gx,gy, g2x, g2y); } } } return farPoint; } private int findFarPoint() { int i,im; double m; im = 0; m = pwkz[im]; for (i=0; i<8; i++) { if (pwkz[i]0) { try { Thread.sleep(sleepTime); } catch (InterruptedException e) { } } } } // --------------------------- set initial condition ----------- private void setInitialCondition() { iterCount = 0; setPotential(); setOcc(Nstate,NOE); setState(Nstate); } void setPotential() { int i,j,k; double x,y,z,r2,s; for (i=0;i=x0 && x<=x1) { rhoExt[i][j][k] = 1.0; s += 1.0; } } } } for (i=0;i=NNx) ip = 0; // im = i-1; if (im<0) im = NNx-1; for (j=0; j=NNy) jp = 0; jm = j-1; if (jm<0) jm = NNy-1; for (k=0; k=NNz) kp = 0; km = k-1; if (km<0) km = NNz-1; vvh[i][j][k] += w*(vvh[i+1][j][k]+vvh[i-1][j][k]+vvh[i][jp][k]+vvh[i][jm][k]+vvh[i][j][kp]+vvh[i][j][km]-6.0*vvh[i][j][k] +h2*rho[i][j][k]); vvext[i][j][k] += w*(vvext[i+1][j][k]+vvext[i-1][j][k]+vvext[i][jp][k]+vvext[i][jm][k]+vvext[i][j][kp]+vvext[i][j][km]-6.0*vvext[i][j][k] +h2*rhoExt[i][j][k]); } } } } } // -- LDA: J. P. Perdew and A. Zunger; Phys. Rev., B23, 5048 (1981) private void setVxc() { int i,j,k; double c1,rh,rh3,rs,sqrtrs,ec; c1 = -0.984745022; for (i=0; i=1.0) { sqrtrs = Math.sqrt(rs); ec = -0.1423/(1.0+1.0529*sqrtrs+0.3334*rs); vvc[i][j][k] = ec*(1.0+1.22838*sqrtrs+0.4445*rs)/(1.0+1.0529*sqrtrs+0.3334*rs); } else { vvc[i][j][k] = -0.05837-0.0084*rs +(0.0311+0.00133*rs)*Math.log(rs); } } } } } private double eeCorrelation(double rh) { double r,ec; r = 0.6204/(Math.pow(rh,0.33333333)+1.0e-20); if (r>=1.0) { ec = -0.1423/(1.0+1.0529*Math.sqrt(r)+0.3334*r); } else { ec = -0.0480-0.0116*r+(0.0311+0.0020*r)*Math.log(r); } return ( ec ); } // (2) steepest descent - sdEnergy[ist], sdState[ist][][][] private void SD(int stateMax, double v[][][], int iterMax, double dump) { int i,ist; for (i=0; i=NNx) ip = 0; // im = i-1; if (im<0) im = NNx-1; for (j=0; j=NNy) jp = 0; jm = j-1; if (jm<0) jm = NNy-1; for (k=0; k=NNz) kp = 0; km = k-1; if (km<0) km = NNz-1; psi[i][j][k] -= dump*((6.0*psi[i][j][k]-psi[i+1][j][k]-psi[i-1][j][k]-psi[i][jp][k]-psi[i][jm][k]-psi[i][j][kp]-psi[i][j][km])/h2 + (v[i][j][k]-ei)*psi[i][j][k]); } } } normalize(psi); return (ei); } private double energyOf(double psi[][][], double v[][][]) { int i,j,k,ip,im,jp,jm,kp,km; double h2,s,sn,ps; h2 = 2.0*dx*dx; s = 0.0; sn=0.0; for (i=1; i=NNx) ip = 0; // im = i-1; if (im<0) im = NNx-1; for (j=0; j=NNy) jp = 0; jm = j-1; if (jm<0) jm = NNy-1; for (k=0; k=NNz) kp = 0; km = k-1; if (km<0) km = NNz-1; ps = psi[i][j][k]; s += ps*((6.0*ps-psi[i+1][j][k]-psi[i-1][j][k]-psi[i][jp][k]-psi[i][jm][k]-psi[i][j][kp]-psi[i][j][km])/h2 + v[i][j][k]*ps); sn += ps*ps; } } } return ( s/sn ); } // 2-2 Gram-Schmidt private void GramSchmidt(int stateMax) { int i,j,k,ist,istate; double s; normalize(sdState[0]); for (istate=1; istate=0; ist--) { if (sdEnergy[ist]>sdEnergy[ist+1]+0.0001) { for (i=0;ieUpper) eUpper = sdEnergy[i]; if(sdEnergy[i]1.0e-12) { eFermi = (eUpper+eLower)/2.0; ntrial = trialOcc(maxState, eFermi); if (ntrial