/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& | YLL 4/11/2004 | Modified for Eliashberg .... | | Basic framework for eliashulation. | Class inheritance hierarchy: | eliash extends Applet | eliashCanvas extends Canvas | eliashFrame extends Frame | Member hierarchy: | eliashFrame sf | |--- Applet applet | |--- eliashFrame sf (circular reference) | |--- GridBagConstraints gbc (data structure) | |--- eliashCanvas cv (placed LHS) | |--- Panel panelControl (placed RHS) | |--- List listPreset | |--- Choice choiceMode | |--- ... | Coordinate systems: | xmax=wxbor+xdisp+wxbor (eliashulate xmax*ymax cells, display xdisp*ydisp) | use 50 and 0.03 for mags &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ /* Sorry, you need a Java-enabled browser to see the eliashulation. */ // some graphics ssettings // Note: coordinate scing: // [x] [xs 0 xo] [wx] // [y] = [0 ys yo] [wy] // [1] [0 0 1 ] [1 ] import java.awt.*; import java.applet.Applet; //import java.lang.Math; import java.awt.event.*; import java.util.Random; // for clas RAndom public class eliash extends Applet { //----- Override Applet methods ----- eliashFrame sf; public void init() {sf = new eliashFrame(this); sf.init(); } public void destroy() {if (sf != null) sf.dispose(); sf = null; } }; class eliashCanvas extends Canvas { eliashFrame sf; eliashCanvas(eliashFrame sf0) {sf = sf0;} // public Dimension getPreferredSize() {return new Dimension(300,400);} // public Dimension getMinimumSize() {return new Dimension(16,16);} // doesn't help public void update(Graphics g) {sf.updateeliash(g);} public void paint(Graphics g) {sf.updateeliash(g);} }; class eliashFrame extends Frame implements ComponentListener, ActionListener, AdjustmentListener, // MouseMotionListener, MouseListener, ItemListener, WindowListener { //----- Objects ----- static long timeNow,timeLast,timeElapsed; static int framesElapsed=0; float fps; Random random; Dimension dimWin; int winwidth,winheight; Image imOffscreen; ScrollPane spControl; Panel panelControl; Button buttonClear; Checkbox cbRunning; Choice choiceMode; Label labelSpeed; Label labelRes; Label labelFPS; List listPreset; Scrollbar sbDamping; Scrollbar sbSpeed; Scrollbar sbRes; Scrollbar sbBri; eliashCanvas cv; eliash applet; TextField tfxmax; TextField tfymax; TextField tfTem; TextField tfgnu; static final float pi = (float)Math.PI; static final float twopi = (float)(2*Math.PI); static final float ootwopi = (float)(1/(2*Math.PI)); float xmin,ymin,xmax,ymax; int wxmin,wymin,wxmax,wymax; int xorg,yorg; float xsc,ysc; float magD,magF,magV; float t; int pause; int nmax; float dd[]; float ff[]; float ddnew[]; float tem;//=0.01f; // temperature T float gnu; //----- Constructor ----- eliashFrame(eliash applet0) {super("eliash"); applet = applet0; } //----- init(), reinit() are actually user-defined ---- public void init() { random = new Random(); timeNow = System.currentTimeMillis(); timeLast = System.currentTimeMillis(); t = 0.0f; this.addWindowListener(this); cv = new eliashCanvas(this); cv.addComponentListener(this); cv.addMouseListener(this); //cv.addMouseMotionListener(this); this.add(cv, BorderLayout.CENTER); spControl = new ScrollPane(); this.add(spControl, BorderLayout.LINE_END); panelControl = new Panel(); panelControl.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.insets = new Insets (0, 8, 0, 8); // S,W,N,E spControl.add(panelControl); spControl.setSize (160, 800); // can't help it listPreset = new List(4, false); listPreset.add("Clear"); listPreset.add("Vortex pair"); listPreset.add("Pluto"); //listPreset.addItemListener(this); don't listen to item events from list listPreset.addActionListener(this); panelControl.add(listPreset, gbc); choiceMode = new Choice(); choiceMode.add("Choice"); choiceMode.add("Choice 2"); choiceMode.addItemListener(this); panelControl.add(choiceMode, gbc); buttonClear = new Button("Button"); panelControl.add(buttonClear, gbc); buttonClear.addActionListener(this); cbRunning = new Checkbox("Running", true); cbRunning.addItemListener(this); panelControl.add(cbRunning, gbc); panelControl.add(labelSpeed = new Label("eliashulation Speed", Label.CENTER), gbc); panelControl.add(sbSpeed = new Scrollbar(Scrollbar.HORIZONTAL, 1, 1, 1, 100), gbc); sbSpeed.addAdjustmentListener(this); gbc.gridwidth = GridBagConstraints.RELATIVE; panelControl.add(new Label("xmax"), gbc); gbc.gridwidth = GridBagConstraints.REMAINDER; panelControl.add(tfxmax = new TextField("1"), gbc); tfxmax.addActionListener(this); gbc.gridwidth = GridBagConstraints.RELATIVE; panelControl.add(new Label("ymax"), gbc); gbc.gridwidth = GridBagConstraints.REMAINDER; panelControl.add(tfymax = new TextField("0.1"), gbc); tfymax.addActionListener(this); gbc.gridwidth = GridBagConstraints.RELATIVE; panelControl.add(new Label("g*nu"), gbc); gbc.gridwidth = GridBagConstraints.REMAINDER; panelControl.add(tfgnu = new TextField("0.4"), gbc); tfgnu.addActionListener(this); gbc.gridwidth = GridBagConstraints.RELATIVE; panelControl.add(new Label("T"), gbc); gbc.gridwidth = GridBagConstraints.REMAINDER; panelControl.add(tfTem = new TextField("0.001"), gbc); tfTem.addActionListener(this); /* labelFPS = new Label("FPS"); panelControl.add(labelFPS, gbc); */ //somepa arams setParams(); magD = 1f; magV = 0.01f; nmax = 512; pause = 10; reinit(); // cv.setBackground(Color.gray); setSize(800, 800); handleResize(); show(); } void reinit() { dd = new float[nmax]; ff = new float[nmax]; ddnew = new float[nmax]; int n; for (n=0; n= 1000) { fps = framesElapsed*1000.0f/timeElapsed; //labelFPS.setText (timeElapsed+"ms"); labelFPS.setText ("FPS: "+(int)fps + "; IPS: " +(int)(fps*iterCount)); timeLast = timeNow; framesElapsed = 0; } */ //----- Eliashberg equations ----- // let 2*pi*nu=1 float x,y,w,e,tpt,d; int m,n,X,Y,X2,Y2; tpt = twopi*tem; // For some reason, applet becomes unresponsive if updateeliash finishes too quickly // (bizarre!) Therefore set speed high. ...? for (int iter=0; iter0) g.drawLine (X, Y, X2, Y2); X = X2; Y = Y2; } // V g.setColor (Color.red); X=Y=0; for (n=0; n0) g.drawLine (X, Y, X2, Y2); X = X2; Y = Y2; } t++; } //----- Put offscreen image to screen even if sim is paused ----- realg.drawImage(imOffscreen, 0, 0, this); //----- Trigger the next update within ms (pause a bit redundant ...) ----- if (boolRunning) { cv.repaint(pause); } } }