/*======= 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<