/* steepest descent - time-dependent Kohn-Sham 3D */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2004.11.20 */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class steepestDescentTDKS extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { /* -------------------------------------- set global ------ */ Choice che,cvw; Button bt_reset, bt_start, bt_stop,bt_loss; Scrollbar spx,spy,spz; Thread th = null; Dimension dim; Image imgOff; Graphics gOff; int sleepTime = 30; int dispMode = 0; int dispObject = 1; double px0 = 1.0; double py0 = 0.0; double pz0 = 0.0; int lossFlag = 0; int started = 1; int dgX, dgY, dgXb,dgYb; double viewTheta = -15.0*3.14/180.0; double viewFai = -72.0*3.14/180.0; double dtheta = 0.0*3.14/180.0; double pai = 3.1415926536; double cosTh = Math.cos(viewTheta); double sinTh = Math.sin(viewTheta); double cosFi = Math.cos(viewFai); double sinFi = Math.sin(viewFai); double t = 0.0; double dx = 1.0/2.0; double dy = 1.0/2.0; double dz = 1.0/2.0; double dt = 0.25*(dx*dx); int NNx = 32+1; int NNy = 32+1; int NNz = 32+1; int NN = NNx+1; /* max(NNx,NNy,NNz)+1 */ int NNr = 500; int NNe = 2; double energy[] = new double[NNe]; double psi[][][][][] = new double[NNe][NNx][NNy][NNz][2]; double wrk[][][][] = new double[NNx][NNy][NNz][2]; double vv[][][] = new double[NNx][NNy][NNz]; double vvext[][][] = new double[NNx][NNy][NNz]; double vvh[][][] = new double[NNx][NNy][NNz]; double vvx[][][] = new double[NNx][NNy][NNz]; double vvc[][][] = new double[NNx][NNy][NNz]; double rho[][][] = new double[NNx][NNy][NNz]; double rs[][][] = new double[NNx][NNy][NNz]; double aaRe[] = new double[NN]; double aaIm[] = new double[NN]; double bbRe[] = new double[NN]; double bbIm[] = new double[NN]; double bRe[] = new double[NN]; double bIm[] = new double[NN]; double uRe[] = new double[NN]; double uIm[] = new double[NN]; int xpts[] = new int[NN]; int ypts[] = new int[NN]; double icol[] = new double[NN]; int pxBox[] = new int[8]; int pyBox[] = new int[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} }; double srh[] = new double[NNr+1]; int xptr[] = new int[NNr+1]; int yptr[] = new int[NNr+1]; int zptr[] = new int[NNr+1]; /* ----------------------------- applet control ------ */ public void init() { resize(630,320); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); che = new Choice(); che.addItem("0"); che.addItem("1"); che.addItemListener(this); che.select("1"); cvw = new Choice(); cvw.addItem("rho"); cvw.addItem("dens-i"); cvw.addItem("phase-i"); cvw.addItem("cloud-i"); cvw.addItem("p flow-i"); cvw.addItem("p+dens-i"); cvw.addItem("v flow-i"); cvw.addItem("v+dens-i"); cvw.addItem("grid-i"); cvw.addItem("2D dens-i"); cvw.addItem("2D phase-i"); cvw.addItem("Vext"); cvw.addItem("VH x20"); cvw.addItem("Vx x20"); cvw.addItem("Vc x20"); cvw.addItem("Veff"); cvw.addItemListener(this); cvw.select("rho-0+1"); bt_reset= new Button("reset"); bt_reset.addActionListener(this); bt_start= new Button("start"); bt_start.addActionListener(this); bt_stop = new Button("stop"); bt_stop.addActionListener(this); bt_loss = new Button("loss"); bt_loss.addActionListener(this); spx= new Scrollbar(Scrollbar.HORIZONTAL,300,10,0,410); spx.addAdjustmentListener(this); spy= new Scrollbar(Scrollbar.HORIZONTAL,200,10,0,410); spy.addAdjustmentListener(this); spz= new Scrollbar(Scrollbar.HORIZONTAL,200,10,0,410); spz.addAdjustmentListener(this); addMouseListener(this); addMouseMotionListener(this); setLayout(new BorderLayout()); Panel pnl = new Panel(); pnl.setLayout(new GridLayout(1,6,5,0)); pnl.add(bt_reset); pnl.add(bt_start); pnl.add(bt_stop); /* pnl.add(new Label(" ")); */ pnl.add(che); pnl.add(cvw); pnl.add(bt_loss); add(pnl,"North"); setInitialCondition(); } 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() == cvw){ dispMode = cvw.getSelectedIndex(); } else if (ev.getSource() == che){ dispObject = che.getSelectedIndex(); } } public void actionPerformed(ActionEvent ev){ if(ev.getSource() == bt_reset){ started = -1; } else if(ev.getSource() == bt_start){ started = 1; } else if(ev.getSource() == bt_stop){ started = 0; } else if(ev.getSource() == bt_loss){ if(lossFlag==0) { lossFlag = 1; } else { lossFlag = 0; } } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == spx) { px0 = 0.01*(double)(spx.getValue()-200); } else if (ev.getSource() == spy) { py0 = 0.01*(double)(spy.getValue()-200); } else if (ev.getSource() == spz) { pz0 = 0.01*(double)(spz.getValue()-200); } } 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; } viewTheta += 0.5*3.14/180.0*(dgX-dgXb); viewFai += 0.5*3.14/180.0*(dgY-dgYb); cosTh = Math.cos(viewTheta); sinTh = Math.sin(viewTheta); cosFi = Math.cos(viewFai); sinFi = Math.sin(viewFai); } public void run() { while (th != null) { try { timeEvolution(); 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 ie,gb,gbx,gby; double ev0,ek0,ev1,ek1; double dens; gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); dens = 200.0; if (dispMode==0) { boxPlot(); dens3DPlot(psi[0],dens,2); boxPlot2(); } else if (dispMode==1) { boxPlot(); dens3DPlot(psi[dispObject],dens,0); boxPlot2(); } else if (dispMode==2) { boxPlot(); dens3DPlot(psi[dispObject],dens,1); boxPlot2(); } else if (dispMode==3) { boxPlot(); cloud3DPlot(psi[dispObject]); boxPlot2(); } else if (dispMode==4) { boxPlot(); momentum3DPlot(psi[dispObject],dens,0); boxPlot2(); } else if (dispMode==5) { boxPlot(); momentum3DPlot(psi[dispObject],dens,1); boxPlot2(); } else if (dispMode==6) { boxPlot(); momentum3DPlot(psi[dispObject],dens,2); boxPlot2(); } else if (dispMode==7) { boxPlot(); momentum3DPlot(psi[dispObject],dens,3); boxPlot2(); } else if (dispMode==8) { gridPlot(psi[dispObject],NNz/2, 1.0*dens, 0.1); } else if (dispMode==9) { densPlot(psi[dispObject],25, 0); } else if (dispMode==10) { densPlot(psi[dispObject],25, 1); } else if (dispMode==11) { gridFnPlot(vvext, NNz/2, 0.25); } else if (dispMode==12) { gridFnPlot(vvh, NNz/2, 5.0); } else if (dispMode==13) { gridFnPlot(vvx, NNz/2, 5.0); } else if (dispMode==14) { gridFnPlot(vvc, NNz/2, 5.0); } else if (dispMode==15) { gridFnPlot(vv, NNz/2, 0.25); } gOff.setColor(Color.blue); gOff.drawString("t="+(int)(t*2418.9+0.5)/100.0+" as",10,40); gOff.setColor(Color.black); gOff.drawString("object",630/6*3+10,40); gOff.drawString("view",630/6*4+10,40); if (lossFlag==1) { gOff.drawString("loss=ON",630/6*5+10,40); } else { gOff.drawString("loss=OFF",630/6*5+10,40); } gb = 330; gOff.setColor(Color.blue); gOff.drawString("box="+(int)(NNx*dx)+"x"+ +(int)(NNy*dy)+"x"+(int)(NNz*dz)+" au",gb,60); for (ie=0; ie="+(float)(meanPosX(psi[ie])-4.0)+" ",gbx,gby+15); gOff.drawString("="+(float)(meanPosY(psi[ie])-4.0)+" ",gbx,gby+30); gOff.drawString("="+(float)(meanPosZ(psi[ie])-4.0)+" ",gbx,gby+45); } for (ie=0; ie|="+(float)(innerNorm(psi[ie],psi[dispObject]))+" ",gb,260+15*ie); } } /*------------------------------- plot methods ------------*/ void densPlot(double ph[][][][], double weight, int mode) { int i,j,k; int gbx,gby,mag; double ph2,col; gbx = 30; gby = 70; mag = 6; gOff.setColor(Color.black); gOff.fillRect(gbx-1,gby-1,mag*NNx+1,mag*NNy+1); k = NNz/2; for (i=1; i0.1) { if (ph2>1.0) { ph2 = 1.0; } if (mode==0) { gOff.setColor(Color.getHSBColor(0.15f, 0.95f, (float)(ph2))); } else if (mode==1) { col = 0.5+0.5*ph[i][j][k][0]/Math.sqrt(ph2/weight); gOff.setColor(Color.getHSBColor((float)col, 0.9f, (float)(ph2))); } gOff.fillRect(gbx+mag*i,gby+mag*j, mag, mag); } } } } void gridPlot(double ph[][][][], int zPos,double phWeight, double vvWeight) { int i,j,k,gbx,gby; int cx,cy,cz; double z,px,py,pz,sc; double ph2; cx = NNx/2; cy = NNy/2; cz = 0; sc = 8.0; gbx = 30+(int)(cx/sc); gby = 20+(int)(cy/sc); k = zPos; for(j=0; j0.004) { icol[i] = 0.15; } else if (vv[i][j][k]>0.0) { icol[i] = 0.33; } else { icol[i] = 0.66; } } for (i=0; i0.004) { icol[j] = 0.15; } else if (vv[i][j][k]>0.0) { icol[j] = 0.33; } else { icol[j] = 0.66; } } for (j=0; j0) { if (ir>10) { ir = 10; } z = k*mag; ppy = cosFi*(j*mag-cyy)+sinFi*(z-czz) + cyy; ppz = -sinFi*(j*mag-cyy)+cosFi*(z-czz) + czz; ppx = cosTh*(i*mag-cxx)+sinTh*(ppz-czz) + cxx; ppz = -sinTh*(i*mag-cxx)+cosTh*(ppz-czz) + czz; ix = (int)(ppx)+gbx; iy = (int)(ppy)+gby; col = 0.0; if (mode==0 || mode==2) { col = 0.66 -0.05*dens; if (col<0.0) { col = 0.0; } } else if (mode==1) { col = 0.5+0.5*ph[i][j][k][0]/Math.sqrt(dens); } gOff.setColor(Color.getHSBColor((float)col, 0.9f,0.9f)); gOff.fillOval(ix-ir/2,iy-ir/2,ir,ir); } } } } } void cloud3DPlot(double ph[][][][]) { int i,j,k,ix,iy,ir,m; int gbx,gby; double cxx,cyy,czz; double z,ppx,ppy,ppz; double mag; setsrh(ph); gbx = 60; gby = 80; mag = 6.0; cxx = mag*(NNx/2.0); cyy = mag*(NNy/2.0); czz = mag*(NNz/2.0); ir = 4; for (m=0; m0.0025) { pxphRe = (ph[i+1][j][k][1]-ph[i-1][j][k][1])/(2*dx); pxphIm = (-ph[i+1][j][k][0]+ph[i-1][j][k][0])/(2*dx); px = (ph[i][j][k][0]*pxphRe + ph[i][j][k][1]*pxphIm); pyphRe = (ph[i][j+1][k][1]-ph[i][j-1][k][1])/(2*dy); pyphIm = (-ph[i][j+1][k][0]+ph[i][j-1][k][0])/(2*dy); py = (ph[i][j][k][0]*pyphRe + ph[i][j][k][1]*pyphIm); pzphRe = (ph[i][j][k+1][1]-ph[i][j][k-1][1])/(2*dz); pzphIm = (-ph[i][j][k+1][0]+ph[i][j][k-1][0])/(2*dz); pz = (ph[i][j][k][0]*pzphRe + ph[i][j][k][1]*pzphIm); z = k*mag; ppy = cosFi*(j*mag-cyy)+sinFi*(z-czz) + cyy; ppz = -sinFi*(j*mag-cyy)+cosFi*(z-czz) + czz; ppx = cosTh*(i*mag-cxx)+sinTh*(ppz-czz) + cxx; ppz = -sinTh*(i*mag-cxx)+cosTh*(ppz-czz) + czz; ix = (int)(ppx)+gbx; iy = (int)(ppy)+gby; if (mode==2 || mode==3) { px = 0.02*px/dens; py = 0.02*py/dens; pz = 0.02*pz/dens; } z = k*mag+pz*amp; ppy = cosFi*(j*mag+py*amp-cyy)+sinFi*(z-czz) + cyy; ppz = -sinFi*(j*mag+py*amp-cyy)+cosFi*(z-czz) + czz; ppx = cosTh*(i*mag+px*amp-cxx)+sinTh*(ppz-czz) + cxx; ppz = -sinTh*(i*mag+px*amp-cxx)+cosTh*(ppz-czz) + czz; ix2 = (int)(ppx)+gbx; iy2 = (int)(ppy)+gby; gOff.setColor(Color.getHSBColor(0.01f, 0.9f,0.9f)); gOff.drawLine(ix,iy,ix2,iy2); if (mode==1 || mode==3) { dens = ph[i][j][k][0]*ph[i][j][k][0]+ph[i][j][k][1]*ph[i][j][k][1]; ir = (int)(weight*dens); if (ir>5) ir = 5; gOff.setColor(Color.getHSBColor(0.66f, 0.9f,0.9f)); gOff.fillOval(ix-ir/2,iy-ir/2,ir,ir); } } } } } } void boxPlot() { int i,j,k,ip,i1,i2; int gbx,gby; double cxx,cyy,czz; double z,ppx,ppy,ppz; double mag,dens; gbx = 60; gby = 80; mag = 6.0; cxx = mag*(NNx/2.0); cyy = mag*(NNy/2.0); czz = mag*(NNz/2.0); ip = 0; for (i=0; isrh[j+1]) { s = srh[j+1]; srh[j+1] = srh[j]; srh[j] = s; } } } m = 0; s = 0.0; for (i=0;isrh[m] && m=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 ); } /* ----------------------------- time step -------------- */ void kxStep(double ph[][][][], double deltat) { int i,j,k; double a,aaAb,auAb; a = 4.0*dx*dx/deltat; for (k=1; k=1; i--) { ph[i][j][k][0] -= ph[i+1][j][k][0]*uRe[i] - ph[i+1][j][k][1]*uIm[i]; ph[i][j][k][1] -= ph[i+1][j][k][0]*uIm[i] + ph[i+1][j][k][1]*uRe[i]; } } } } void kyStep(double ph[][][][], double deltat) { int i,j,k; double a,aaAb,auAb; a = 4.0*dx*dx/deltat; for (i=1; i=1; j--) { ph[i][j][k][0] -= ph[i][j+1][k][0]*uRe[j] - ph[i][j+1][k][1]*uIm[j]; ph[i][j][k][1] -= ph[i][j+1][k][0]*uIm[j] + ph[i][j+1][k][1]*uRe[j]; } } } } void kzStep(double ph[][][][], double deltat) { int i,j,k; double a,aaAb,auAb; a = 4.0*dx*dx/deltat; for (i=1; i=1; k--) { ph[i][j][k][0] -= ph[i][j][k+1][0]*uRe[k] - ph[i][j][k+1][1]*uIm[k]; ph[i][j][k][1] -= ph[i][j][k+1][0]*uIm[k] + ph[i][j][k+1][1]*uRe[k]; } } } } void phaseStep(double ph[][][][], double deltat) { int i,j,k; double th,cs,sn,phr,phi; for (i=1; i