/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
| 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
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
/*
*/
// 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);
}
}
}