/*======= HTML HEADER AT BEGINNING OF JAVA SOURCE CODE =======
Lovely applet
This is a simulation of the Dissipative Quantum Rotor model in the charge representation. It calculates C(tau) but the accuracy is awful.
========= END OF HTML ================================================*/
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
| YLL 2005/04/04
| To compile: g lovely
| To run: av lovely.java
| Motivation for using separate Frame: Resizable!
|
| Basic framework for Simulation.
| Class inheritance hierarchy:
| Sim extends Applet
| SimCanvas extends Canvas
| SimFrame extends Frame
| Member hierarchy:
| SimFrame sf
| |--- Applet applet
| |--- SimFrame sf (circular reference)
| |--- GridBagConstraints gbc (data structure)
| |--- SimCanvas cv (placed LHS)
| |--- Panel panelControl (placed RHS)
| |--- ...
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import java.util.Random;
public class lovely extends Applet {
//----- Override Applet methods -----
SimFrame sf;
public void init() {
this.setFont (new Font("SERIF", Font.PLAIN, 12));
this.add (new Label("Launched simulation in separate window."));
sf=new SimFrame(this); sf.init();
sf.setFont (new Font("SERIF", Font.PLAIN, 12));
}
public void destroy() {if (sf!=null) sf.dispose(); sf=null;}
};
class SimCanvas extends Canvas {
SimFrame sf;
SimCanvas(SimFrame sf0) {sf = sf0;}
public Dimension getPreferredSize() {return new Dimension(300,400);}
public void update(Graphics g) {sf.updateSim(g);}
public void paint(Graphics g) {sf.updateSim(g);}
};
class SimFrame extends Frame
implements ComponentListener, ActionListener, ItemListener, WindowListener {
//========== GUI AND SIMULATION OBJECTS
lovely applet;
static long timeNow,timeLast,timeElapsed;
static int framesElapsed=0;
double fps;
static Random random;
Dimension dimWin;
int wxmax,wymax;
Image imOffscreen;
Panel panelControl;
Checkbox cbStep;
Checkbox cbRunning;
Label labelFPS;
Label labelIPS;
SimCanvas cv;
TextField tfMSlices;
TextField tfSpeed;
TextField tfgggg;
TextField tfbetaEc;
//static final Color col01 = new Color (0x66DDFF);
final int delay = 0;
static final double PI = (double)Math.PI;
//static final double TWOPI = (double)(2*Math.PI);
//static final double OOTWOPI = (double)(1/(2*Math.PI));
int iSpeed;
int pause;
//========== CONSTRUCTOR
SimFrame(lovely applet0) {super("Sim"); applet = applet0; }
//========== init(), reinit() (USER-DEFINED)
public void init() {
//----- GUI-----
this.addWindowListener(this);
cv = new SimCanvas(this);
cv.addComponentListener(this);
panelControl = new Panel();
panelControl.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets (0, 8, 0, 8); // S,W,N,E
this.add(cv, BorderLayout.CENTER);
this.add(panelControl, BorderLayout.LINE_END);
gbc.gridwidth = GridBagConstraints.REMAINDER;
panelControl.add(new Label("Click 'Running' to start simulating."), gbc);
panelControl.add(new Label("Press Enter after changing parameters!"), gbc);
gbc.gridwidth = GridBagConstraints.RELATIVE;
panelControl.add(new Label("Timeslices M"), gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
panelControl.add(tfMSlices = new TextField("256"), gbc);
tfMSlices.addActionListener(this);
gbc.gridwidth = GridBagConstraints.RELATIVE;
panelControl.add(new Label("Dissipation g"), gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
panelControl.add(tfgggg = new TextField("0.1"), gbc); //0.001
tfgggg.addActionListener(this);
gbc.gridwidth = GridBagConstraints.RELATIVE;
panelControl.add(new Label("beta*Ec"), gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
panelControl.add(tfbetaEc = new TextField("256.0"), gbc);
tfbetaEc.addActionListener(this);
gbc.gridwidth = GridBagConstraints.RELATIVE;
panelControl.add(new Label("Simulation speed"), gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
panelControl.add(tfSpeed = new TextField("10000"), gbc);
tfSpeed.addActionListener(this);
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.WEST;
panelControl.add(cbStep = new Checkbox("Step", true), gbc);
cbStep.addItemListener(this);
panelControl.add(cbRunning = new Checkbox("Running", false), gbc); //
cbRunning.addItemListener(this);
gbc.gridwidth = GridBagConstraints.RELATIVE;
panelControl.add(new Label("FPS:"), gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
panelControl.add(labelFPS=new Label("fps "), gbc);
gbc.gridwidth = GridBagConstraints.RELATIVE;
panelControl.add(new Label("IPS:"), gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
panelControl.add(labelIPS=new Label("ips "), gbc);
//----- Params -----
/*
int blah=123;
try {blah = Integer.parseInt(applet.getParameter("MSLICES"));} catch (Exception e) {}
tfMSlices.setText(Integer.toString(blah));
*/
getParamsFromGUI();
pause = 10;
//----- Various -----
random = new Random();
timeNow = System.currentTimeMillis();
timeLast = System.currentTimeMillis();
reinit();
cv.setBackground(Color.black); //
setSize(1024, 384);
handleResize();
show();
}
//----- Override paint -----
public void paint(Graphics g) {cv.repaint();}
//----- Implement WindowListener -----
public void windowClosing(WindowEvent e) {dispose();}
public void windowOpened(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
//----- Implement ComponentListener -----
public void componentHidden(ComponentEvent e){}
public void componentMoved(ComponentEvent e){}
public void componentShown(ComponentEvent e) {cv.repaint(); }
public void componentResized(ComponentEvent e) {handleResize(); cv.repaint(100);}
//----- Implement ItemListener -----
public void itemStateChanged(ItemEvent e) {
if (e.getItemSelectable() == cbRunning ||
e.getItemSelectable() == cbStep )
cv.repaint();
}
//----- Implement ActionListener -----
public void actionPerformed(ActionEvent e) {
reinit(); cv.repaint(); //better restart!
/*
if (e.getSource()==tfMSlices) { // || e.getSource()==tfSizeY) {
reinit(); cv.repaint(); // mslices changed!
}
else if (true) {
getParamsFromGUI();
}
*/
}
//----- User-defined methods -----
// reinit gets values from .... and restarts the whole thing!
// getParamsFromGUI() reads values from text fields/sliders
void reinit() {
mslices = Integer.parseInt(tfMSlices.getText());
gggg = Double.parseDouble (tfgggg.getText());
betaEc = Double.parseDouble (tfbetaEc.getText());
iSpeed = Integer.parseInt (tfSpeed.getText());
dqrcrInit();
}
void getParamsFromGUI() {
iSpeed = Integer.parseInt (tfSpeed.getText());
}
void handleResize() {
dimWin = cv.getSize(); wxmax = dimWin.width; wymax = dimWin.height;
if (wxmax<=0 || wymax<=0) return;
imOffscreen = createImage(wxmax, wymax);
}
public void updateSim(Graphics realg) {
if (dimWin==null || wxmax==0) {handleResize(); return;} // IE workaround
Graphics g = imOffscreen.getGraphics();
boolean boolRunning = cbRunning.getState();
boolean boolStep = cbStep.getState();
//int xscal = wxmax/xmax;
int x,y,col,X,Y,X1,Y1,X2,Y2;
int xp,yp,xm,ym,nbonds;
int x2,y2;
int ihead,itail;
byte s = 0;
if (boolRunning||boolStep) {
timeNow = System.currentTimeMillis();
timeElapsed = timeNow - timeLast;
framesElapsed++;
if (timeElapsed >= 1000) {
fps = framesElapsed*1000.0f/timeElapsed;
//labelFPS.setText (timeElapsed+"ms");
labelFPS.setText (""+(int)fps);
labelIPS.setText (""+(int)(fps*iSpeed));
timeLast = timeNow;
framesElapsed = 0;
}
for (int it=0; it millisec delay -----
if (boolRunning) {
cv.repaint(pause); //??
}
if (!boolRunning) cbStep.setState(false);
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//
// NUMERICAL KERNEL (CORE OF ALGORITHM)!
//
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//========== KERNEL OBJECTS
int tt[]; // transition times (as multiples of eps)
int qq[]; // charge path
int qtotal,qsqtot; // note: for multi grains need several qswtot intger varas
int npairsmax;
int npairs;
int mslices;
double gggg; //dissipation parameter
double betaEc;
double sumAA; // normalisation constant; appears in Metropolis ratio
WAMsampler wamsampler; // Walker Alias Method sampler
BRBuf brbufarray[]; // Binary reblocking buffers
//===========================================================================
// DQRCR ROUTINES
void dqrcrInit () {
int t;
//ASSUME mslices HAS BEEN SET
npairsmax = 16384; //THIS MAY CAUSE CRASHING
npairs = 0;
tt = new int[npairsmax];
qq = new int[mslices];
for (t=0; t tol) {System.out.println("not norm!");Runtime.getRuntime().exit(1);}
//----- Set up arrays
for (i=0; ibb[j]) {bmin=bb[j]; jmin=j;}
if (bmaxff[n]) n=aa[n]; return n;
}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// BINARY REBLOCKING BUFFER. YLL, based on NDD. JAVA VERSION 2005/05/07.
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
class BRBuf { // Class names have to be BIGandsmall
int Lmax,N;
double a[],b[];
double brb_mean,brb_err; // used for returning values
//========== CONSTRUCTOR: ALLOCATE BUFFER Lmax LEVELS DEEP ==============
public BRBuf (final int Lmax) {
this.Lmax = Lmax;
N = 0;
a = new double[Lmax+1];
b = new double[Lmax+1];
int l;
for (l=0; l<=Lmax; l++) b[l] = 0.0d; // no need to init a
}
//========== APPEND DATA xx AND UPDATE MULTIHEAP
public void append (double xx) {
int l,ivar;
double yy;
ivar = N;
yy = xx;
l = 0;
for (;;) {
b[l] += yy*yy;
if ((ivar & 1) == 0) {a[l] = yy; break;}
else {yy += a[l]; ivar>>=1; l++;}
}
N++;
}
//========== REPORT MEAN AND STDEV in mean and err
public void report () {
int l,S,M,Lmax_actual,key;
double SoB,VoBM,VoMoBM;
double[] aEoMoBM,aEoEoMoBM;
boolean flag_warning;
aEoMoBM = new double[Lmax+1];
aEoEoMoBM = new double[Lmax+1];
if (N<=1) {brb_mean = brb_err = -999.0d; return;}
//System.out.println ("brb_report with N="+N);
//----- Find the level of the largest heap, Lmax_actual.
Lmax_actual=-1; // blah
for (l=0; l<=Lmax; l++) {
if ( (N & (1<=0; l--) {
if ( (N & (1<