/* scatter FDTD 2D */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2004.02.14 */ /* ver 0.0.2 2004.05.15 bug fixed */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class scatterFDTD2D extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { /* -------------------------------------- set global ------ */ Choice cm1,cvw; Button bt_reset, bt_start, bt_stop; Scrollbar scr,slm; Thread th = null; Dimension dim; Image imgOff; Graphics gOff; int sleepTime = 50; int dispMode = 0; int scatterer = 2; int started = 1; double magn = 1.0; double omega = Math.PI/32.0; double theta = 0.0; double t = 0.0; double dt = 1.0; int NNx = 241; int NNy = 201; double Ez[][] = new double[NNx+1][NNy+1]; double Hx[][] = new double[NNx+1][NNy+1]; double Hy[][] = new double[NNx+1][NNy+1]; double ep[][] = new double[NNx+1][NNy+1]; double mu[][] = new double[NNx+1][NNy+1]; double sg[][] = new double[NNx+1][NNy+1]; int metal[][] = new int[NNx+1][NNy+1]; double cr[][] = new double[NNx+1][NNy+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); int NN = NNx+NNy+2; int xpts[] = new int[NN]; int ypts[] = new int[NN]; /* ----------------------------- applet control ------ */ public void init() { resize(630,300); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); cm1 = new Choice(); cm1.addItem("vacuum"); cm1.addItem("metal"); cm1.addItem("dielectrics"); cm1.addItem("ferro-mag"); cm1.addItem("resistor"); cm1.addItemListener(this); cm1.select("dielectrics"); cvw = new Choice(); cvw.addItem("Ez wave"); cvw.addItem("Hxy line"); cvw.addItemListener(this); 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); addMouseListener(this); addMouseMotionListener(this); slm= new Scrollbar(Scrollbar.HORIZONTAL,32,10,8,74); slm.addAdjustmentListener(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(slm); pnl.add(cm1); pnl.add(cvw); 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() == cm1){ scatterer = cm1.getSelectedIndex(); setInitialCondition(); } else if (ev.getSource() == cvw){ dispMode = cvw.getSelectedIndex(); } } public void actionPerformed(ActionEvent ev){ if(ev.getSource() == bt_reset){ started = 0; setInitialCondition(); } else if(ev.getSource() == bt_start){ if (started==0) { started = 1; } else if (started==1) { theta = 0.0; } offPaint(); repaint(); } else if(ev.getSource() == bt_stop){ started = 0; } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == slm) { omega = Math.PI/((double)slm.getValue()); } else if(ev.getSource() == scr) { magn = 0.01*(double)(scr.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; } 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 i,j; int cx,cy,cz,gbx,gby,gb; double z,px,py,pz,sc,scrVar; cx = NNx/2; cy = NNy/2; cz = 0; sc = 2.0; scrVar = 15.0*magn; gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); if (dispMode==0) { gbx = 10+(int)(cx/sc); gby = -80+(int)(cy/sc); for(j=0; j0.0) { gOff.setColor(Color.getHSBColor((float)cr[i][j],0.9f,0.5f)); } else { gOff.setColor(Color.getHSBColor((float)cr[i][j],0.9f,0.9f)); } gOff.drawLine(xpts[i],ypts[i],xpts[i+1],ypts[i+1]); } } for(i=0; i0.0) { gOff.setColor(Color.getHSBColor((float)cr[i][j],0.9f,0.5f)); } else { gOff.setColor(Color.getHSBColor((float)cr[i][j],0.9f,0.9f)); } gOff.drawLine(xpts[j],ypts[j],xpts[j+1],ypts[j+1]); } } } else if (dispMode==1) { gOff.setColor(Color.green); for(j=0; j1.0) { if (mu[i][j]>1.0) { c = 0.85; } else { c = 0.08; } } else { if (mu[i][j]>1.0) { c = 0.66; } } if (sg[i][j]>0.0) { c = c-0.05; } } else { c = 0.15; } cr[i][j] = c; } } } /* ----------------------------- fdtd method 2D -------------- */ void timeEvolution() { if (started==1) { fdtd2D(); fdtd2D(); } } void fdtd2D() { t = t + 0.5*dt; EzEvolution(); EzGenerator(); HxyEvolution(); } void EzGenerator() { int j; double Ezt; theta += omega*0.5*dt; Ezt = Math.sin(theta); if (theta<3.1416*2.0) { for(j=0;j