/* large (1000x1000) FDTD 2D */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2005.02.12 */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class largeFDTD2D extends Applet implements MouseListener, MouseMotionListener, ItemListener, ActionListener, AdjustmentListener, Runnable { /* -------------------------------------- set global ------ */ Choice ch_view; Button bt_reset, bt_start, bt_stop; Scrollbar sc_lambda, sc_magnitude; Thread th = null; Dimension dim; Image imgOff; Graphics gOff; int sleepTime = 50; int dispMode = 0; int started = 1; double magn = 1.0; double omega = Math.PI/100.0; double theta = 0.0; double t = 0.0; double dt = 1.0; int NNx = 1001; int NNy = 1001; 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]; int dgX, dgY, dgXb,dgYb; double viewTheta = -15.0*3.14/180.0; double viewFai = -60.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+2; int xpts[] = new int[NN]; int ypts[] = new int[NN]; /* ----------------------------- applet control ------ */ public void init() { resize(630,450); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); ch_view = new Choice(); ch_view.addItem("Ez grid"); ch_view.addItem("Ez dens"); ch_view.addItem("Hxy vector"); ch_view.addItem("Ez & Hxy"); ch_view.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); sc_lambda= new Scrollbar(Scrollbar.HORIZONTAL,100,10,16,210); sc_lambda.addAdjustmentListener(this); sc_magnitude= new Scrollbar(Scrollbar.HORIZONTAL,100,10,1,210); sc_magnitude.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(sc_lambda); pnl.add(sc_magnitude); pnl.add(ch_view); 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() == ch_view){ dispMode = ch_view.getSelectedIndex(); repaint(); } } 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; } } else if(ev.getSource() == bt_stop){ started = 0; } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == sc_lambda) { omega = Math.PI/((double)sc_lambda.getValue()); } else if(ev.getSource() == sc_magnitude) { magn = 0.01*(double)(sc_magnitude.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 gbx,gby; gOff.setColor(Color.white); gOff.fillRect(0,0,dim.width,dim.height); if (dispMode==0) { gridEzPlot(); } else if (dispMode==1) { densityEzPlot(); } else if (dispMode==2) { matPlot(); vectorHxyPlot(); } else if (dispMode==3) { densityEzPlot(); vectorHxyPlot(); } gOff.setColor(Color.black); gOff.drawString("t="+(int)(t)+" ",630/6*0+10,40); gOff.drawString("lambda="+(int)(Math.PI/omega+0.5)+" ",630/6*3+10,40); gOff.drawString("magn="+(int)(magn*100.0+0.5)+"%",630/6*4+10,40); gOff.drawString("view",630/6*5+10,40); gbx = 530; gby = 360; gOff.setColor(Color.green); gOff.drawString("vaccum",gbx,gby); gOff.setColor(Color.orange); gOff.drawString("metal",gbx,gby+15); gOff.setColor(Color.red); gOff.drawString("dielectrics",gbx,gby+30); gOff.setColor(Color.blue); gOff.drawString("ferromagnetic",gbx,gby+45); gOff.setColor(Color.magenta); gOff.drawString("diele+ferro",gbx,gby+60); gOff.setColor(Color.gray); gOff.drawString("resistor",gbx,gby+75); /* gOff.drawString("theta="+(int)(viewTheta*180.0/3.14)+" ",gbx,210); gOff.drawString("fai="+(int)(viewFai*180.0/3.14)+" ",gbx,230); */ } /* ----------------------------- plot method ------ */ void gridEzPlot() { int i,j; int cx,cy,cz,gbx,gby; double z,px,py,pz,sc,scrVar; cx = NNx/2; cy = NNy/2; cz = 0; sc = 0.5; scrVar = 30.0*magn; gbx = -940+(int)(cx/sc); gby = -1000+(int)(cy/sc); for(j=0; j0.0) { gOff.setColor(Color.getHSBColor((float)colorOf(i,j),0.9f,0.5f)); } else { gOff.setColor(Color.getHSBColor((float)colorOf(i,j),0.9f,0.9f)); } gOff.drawLine(xpts[i],ypts[i],xpts[i+4],ypts[i+4]); } } for(i=0; i0.0) { gOff.setColor(Color.getHSBColor((float)colorOf(i,j),0.9f,0.5f)); } else { gOff.setColor(Color.getHSBColor((float)colorOf(i,j),0.9f,0.9f)); } gOff.drawLine(xpts[j],ypts[j],xpts[j+4],ypts[j+4]); } } } void densityEzPlot() { int i,j,gbx,gby,h; double sc; gbx = 30; gby = 60; h = 3; for(j=0; j1.0) { if (mu[ix][iy]>1.0) { c = 0.85; } else { c = 0.01; } } else { if (mu[ix][iy]>1.0) { c = 0.66; } } if (sg[ix][iy]>0.0) { c = c-0.05; } } else { c = 0.12; } return ( c ); } /* ----------------------------- set initial condition ------ */ void setInitialCondition() { t = 0.0; theta = 0.0; clearField(); setMaterial(); } void clearField() { int i,j; for(i=0;i