/*************************************** * Ising.java * * ----------------------------------- * * Created by Bernd Nottelmann in 1996 * * Last update: 1996/04/13 * ***************************************/ import java.lang.*; import java.awt.*; import java.awt.image.*; public class Ising extends java.applet.Applet implements Runnable { /* Gitterparameter und Feldinhalt */ int dim; // Dimension des Modells int[] ndim; // Ausdehnung in jede Raumrichtung int period; // Zeitvariablen public IsingLattice lattice; // Eigentliches Gitter, hier spielt // sich alles Physikalische ab /* Oeffentliche Parameter */ public int n; // Gitterausdehnung in jede Richtung /* Physikalische Parameter des Modells */ public double Temp; /* Java-Objekte und -Parameter */ Thread is; public boolean stopped=false; // Halte-Flag short plotValue=1; // Spin-Wert boolean plotFlag=false; // Plot-Flag BorderLayout IsLay; // Layout IsingCanvas can; // Hier kommt das Gitter hin ... IsingPanel pan; // ... und hier die Bedienleiste // int[] Panxy={100,70,100,60}; // Platz fuer die Bedienelemente int[] Panxy={100,15,50,10}; // Platz fuer die Bedienelemente // muss auch sein int timeout=50; // Pause-Intervall fuer die // Bilderzeugung in ms public int t; // Zeitvariable public void init() { int j; // Indexvariable dim=2; // Quadratisch, praktisch, ... n=Integer.valueOf(getParameter("latt")).intValue(); // Gitterausdehnung holen Temp=Double.valueOf(getParameter("temp")).doubleValue(); // Temp. aus dem Applet Tag holen ndim=new int[dim]; for (j=0; j -1) actual=next[actual]; value[filled]=val; if (actual > -1) { if (actual!=first) { next[prev[actual]]=filled; prev[filled]=prev[actual]; } else first=filled; prev[actual]=filled; } else { prev[filled]=last; next[last]=filled; last=filled; } next[filled++]=actual; } public int[] get() { // Feld holen actual=first; for (i=0; i= TempMin && Temp < TempMax) this.Temp=Temp; else this.Temp=(TempMin+TempMax)/2; // Die goldene Mitte beta=1/this.Temp; nind=1; // Volumen des Feldes berechnen for (j=0; j= TempMax) { this.Temp=TempMax; beta=0; } } /** 2 dim-Hamiltonian des Ising-Modells t: Zeit (ist doch offensichtlich! :-) **/ public double Hamilton(int t) { int i; double sum=0; for (i=0; i 0) { for (i=0; i yMax || yMin > yMax) yMean=this.yMin=this.yMax=value; else { this.yMin=yMin; this.yMax=yMax; yMean=(yMin+yMax)/2; } } public void initGraphics(ImageObserver imgObs, Image img, Color color) { this.img=img; this.g=img.getGraphics(); this.color=color; width=img.getWidth(imgObs); height=img.getHeight(imgObs); bottom=(int)(0.95*height+0.5)-1; top=(int)(0.05*height+0.5)-1; range=(int)(0.9*height); offset=height/2; xScale=(double)width/n; g.setColor(Color.black); g.fillRect(0,0,width,height); drawLines(); draw(color); } private void draw(Color color) { int i, j, k; if (yMax > yMin) yScale=range/(yMax-yMin); else yScale=1; if (g != null) { g.setColor(color); i=index; k=length; while (--k > 0) { j=(n+i-1)%n; g.drawLine((int)(xScale*k), offset-(int)((y[i]-yMean)*yScale+0.5), (int)(xScale*(k-1)), offset-(int)((y[j]-yMean)*yScale+0.5)); i=j; } } } private void drawLines() { if (g != null) { g.setColor(Color.lightGray); g.drawLine(0,offset,width-1,offset); g.setColor(Color.darkGray); g.drawLine(0,top,width-1,top); g.drawLine(0,bottom,width-1,bottom); } } /* Wert hinzufuegen und gleichzeitig neue Kurve zeichnen */ public synchronized void addValue(double value) { //System.out.println("addValue(double value)"); draw(Color.black); // Erstmal alte Kurve loeschen drawLines(); index=(++index)%n; y[index]=value; if (value < yMin) yMin=value; else if (value > yMax) yMax=value; yMean=(yMin+yMax)/2; if (length < n) ++length; draw(color); // Neue Kurve zeichnen } /* Beschriftung */ public void drawParams(Graphics g, int x, int y) { Font f; FontMetrics fm; int x0, y0; String s1, s2; int w1, w2, wMax; f=new Font("TimesRoman",Font.PLAIN,17); g.setFont(f); fm=g.getFontMetrics(); s1=new Double(yMax).toString(); s2=new Double(yMin).toString(); w1=fm.stringWidth(s1); w2=fm.stringWidth(s2); wMax=(w1 <= w2) ? w1 : w2; g.setColor(Color.black); x0=x+width+8+wMax-w1; y0=y+top+f.getSize()/2; g.drawString(s1,x0,y0); x0=x+width+8+wMax-w2; y0=y+bottom+f.getSize()/2; g.drawString(s2,x0,y0); x0=x+width+8; y0=y+offset+f.getSize()/2; g.drawString(title,x0,y0); } } final class IsingCanvas extends Canvas implements ImageObserver { Ising is; int n; public int[] Panxy; public double dx, dy, dxy; public int wh; Rectangle Rect; Image img, HamiltonImg, MagnetizationImg; Graphics imgGra; public IsingFever Hamilton, Magnetization; boolean GridForbidden=false; public boolean GridFlag=true; boolean ThermoFlag=true, sigmaFlag=true, FeverFlag=true, TimeFlag=true; public boolean SpinsDrawn=false; short[] Spin; public int[] Tempxy=new int[4]; public int[] TempCritxy=new int[4]; public IsingCanvas(Ising is, int[] Panxy) { this.is=is; n=is.n; this.Panxy=Panxy; Hamilton=new IsingFever("Energy per spin",(int)(0.8*Panxy[2])); Magnetization=new IsingFever("Magnetization",(int)(0.8*Panxy[2])); Spin=new short[is.lattice.nind]; } public void init() { Hamilton.init(is.lattice.Hamilton(is.lattice.t), is.lattice.HamiltonMin(),is.lattice.HamiltonMax()); // -2,2); Magnetization.init(is.lattice.Magnetization(is.lattice.t),-1,1); SpinsDrawn=false; } public void reset() { init(); Hamilton.initGraphics(this, createImage(Hamilton.width, Hamilton.height), Hamilton.color); Magnetization.initGraphics(this, createImage(Magnetization.width, Magnetization.height), Magnetization.color); SpinsDrawn=false; } public void setGridFlag(boolean GridFlag) { if (!GridForbidden) { this.GridFlag=GridFlag; if (GridFlag) { img.flush(); img=createImage(wh+1,wh+1); imgGra=img.getGraphics(); paintGrid(imgGra); } else { img.flush(); img=createImage(wh,wh); imgGra=img.getGraphics(); } } SpinsDrawn=false; } public void plot(int x, int y, short value) { if (x >= 0 && x < n && y >=0 && y < n) { Spin[x+n*y]=is.lattice.sigma[is.lattice.t][x+n*y]=value; imgGra.setColor(Color.blue); if (GridFlag) if (value > 0) imgGra.fillRect((int)(x*dxy)+1,(int)(y*dxy)+1, (int)dxy-1,(int)dxy-1); else imgGra.clearRect((int)(x*dxy)+1,(int)(y*dxy)+1, (int)dxy-1,(int)dxy-1); else if (value > 0) imgGra.fillRect((int)(x*dxy),(int)(y*dxy), (int)dxy,(int)dxy); else imgGra.clearRect((int)(x*dxy),(int)(y*dxy), (int)dxy,(int)dxy); } } private void drawSpins() { int i, j, t, pos=0; imgGra.setColor(Color.blue); t=is.lattice.t; if (GridFlag) if (!SpinsDrawn) for (j=0; j 0) imgGra.fillRect((int)(i*dxy)+1,(int)(j*dxy)+1, (int)dxy-1,(int)dxy-1); else imgGra.clearRect((int)(i*dxy)+1,(int)(j*dxy)+1, (int)dxy-1,(int)dxy-1); else for (j=0; j 0) imgGra.fillRect((int)(i*dxy)+1,(int)(j*dxy)+1, (int)dxy-1,(int)dxy-1); else imgGra.clearRect((int)(i*dxy)+1,(int)(j*dxy)+1, (int)dxy-1,(int)dxy-1); ++pos; } else { imgGra.clearRect(0,0,wh+1,wh+1); for (j=0; j 0) imgGra.fillRect((int)(i*dxy),(int)(j*dxy), (int)dxy,(int)dxy); } Spin=is.lattice.sigma[t]; SpinsDrawn=true; } private void paintGrid(Graphics g) { int i; g.setColor(Color.black); for (i=0; i<=n; i++) { g.drawLine(0,(int)(i*dxy),wh,(int)(i*dxy)); g.drawLine((int)(i*dxy),0,(int)(i*dxy),wh); } } /* Thermometer zeichnen */ private void paintThermo(Graphics g) { double x,y,r1,r2,h; double factor=Math.PI/180; int x0,y0,x1,y1,h0,alpha,gamma; r1=0.1*Panxy[0]; r2=0.05*Panxy[0]; h=0.8*wh; x=Panxy[0]/2; y=Panxy[1]+wh-(wh-(h+r1+r2))/2; Tempxy[0]=(int)(x-r2); // Koordinaten des Steuerbereichs Tempxy[1]=(int)(y-h); // des Thermometers festlegen Tempxy[2]=(int)(x+r2); Tempxy[3]=(int)y; alpha=90+(int)(Math.asin(r2/r1)/factor); gamma=360-2*(alpha-90); x0=(int)(x-r1); y0=(int)(y-(r1-r1*Math.cos(factor*(alpha-90)))); g.setColor(Color.red); g.fillArc(x0,y0,(int)(2*r1),(int)(2*r1),alpha,gamma); g.setColor(Color.black); g.drawArc(x0,y0,(int)(2*r1),(int)(2*r1),alpha,gamma); x0=(int)(x-r2); y0=(int)(y-h*is.lattice.Temp/is.lattice.TempMax); h0=(int)(h*is.lattice.Temp/is.lattice.TempMax+ r1*Math.cos(factor*(alpha-90))); g.setColor(Color.red); g.fillRect(x0,y0,(int)(2*r2),h0); y0=(int)(y-h); h0=(int)(h-h*is.lattice.Temp/is.lattice.TempMax); g.setColor(Color.lightGray); g.fillRect(x0,y0,(int)(2*r2),h0); g.setColor(Color.black); g.drawLine(x0,y0,x0,(int)(y0+h)); g.drawLine(x0+(int)(2*r2),y0,x0+(int)(2*r2),(int)(y0+h)); y0=(int)(y-h-r2); g.setColor(Color.lightGray); g.fillArc(x0,y0,(int)(2*r2),(int)(2*r2),0,180); g.setColor(Color.black); g.drawArc(x0,y0,(int)(2*r2),(int)(2*r2),0,180); } private void drawTitle(Graphics g, String s, int x, int y, int fs) { int red, green, blue; Font f; FontMetrics fm; int i; String subs; red=(int)(Math.random()*150); green=(int)(Math.random()*100); blue=(int)(Math.random()*50); f=new Font("TimesRoman",Font.ITALIC,fs); g.setFont(f); fm=g.getFontMetrics(); y+=f.getSize(); for (i=0; i