/* S1040.java * イジングモデル * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.awt.event.*; import window.Window; public class S1040 extends Applet implements ActionListener { Button button0; Button button1; boolean sw =false; TextField text; double w0; /* 正規化温度 */ public void init() { add(new Label("正規化温度(2.27を中心に試す)=")); text = new TextField("2.27"); add(text); button0 = new Button(" 実行 "); button1 = new Button("クリア"); add(button0); add(button1); button0.addActionListener(this); button1.addActionListener(this); } public void actionPerformed(ActionEvent evt) { String label = evt.getActionCommand(); if (label.equals(" 実行 ")) { sw = true; w0 = Double.parseDouble(text.getText()); } else { sw = false; } repaint(); } public void paint(Graphics g) { Window w ; w = new Window(); int SPACE = 30; int HIGHT = 480; int WIDTH = 640; int MAX = 250; /* 配列の大きさ */ long T_END = 1000; /* シミュレーションを終わる時刻 */ int s[][] = new int[MAX+2][MAX+2]; /* (1)磁気モーメントの値 s[i][j]=1あるいはs[i][j]=-1 */ int i,j; /* 着目している原子の番号 */ int e0; /* 相互作用の値 */ int m; /* s[i][j]=1である原子の数 */ int n; /* forのカウンタ */ int tt = 0; /* シミュレーションの時刻 */ double p; /* 反転の確率 */ double gika; /* 磁化率 */ /* 準備 */ w.setWindow(0, 0,0,MAX, MAX, SPACE,MAX+SPACE,MAX+SPACE,SPACE); w.axis(0, "", MAX, "", MAX, g); w.setWindow(1, 0,0.0,T_END,1.0, SPACE,HIGHT-SPACE,WIDTH-SPACE,MAX+2*SPACE); w.axis(1, "時間", T_END / 10.0, "磁化率", 0.1, g); w.moveTo(1, 0, 1.0, g); m = MAX * MAX; /* (2)初期状態 */ for (j = 0; j <= MAX + 1; j ++) { for (i = 0; i <= MAX + 1; i ++) { s[i][j] = 1; } } /* メイン */ if (sw) { /*"実行"が押されたとき*/ while (tt < T_END) { for (n = 1; n <= MAX * MAX; n ++) { i = (int)(MAX * Math.random()) + 1; /* (3)1からMAXまでの乱数 */ j = (int)(MAX * Math.random()) + 1; /* (4)1からMAXまでの乱数 */ e0 = -s[i][j] * (s[i][j - 1] + s[i][j + 1] + s[i - 1][j] + s[i + 1][j]); /* (5)相互作用エネルギーの計算 */ p = Math.exp(((double)(e0) - 4.0) / w0); /* (6)反転確率 */ if ( p > Math.random()) { /* (7) */ s[i][j] = -s[i][j]; /* (8)反転 */ m = m + s[i][j]; } if (s[i][j] == 1) { g.setColor(Color.blue); w.putPixel(0, (double)(i), (double)(j), g); } else { g.setColor(Color.red); w.putPixel(0, (double)(i), (double)(j), g); } } tt = tt + 1; gika = (double)(2 * m) / (double)(MAX * MAX) - 1.0; /* (9)磁化率 */ g.setColor(Color.green); w.lineTo(1, tt, gika, g); } stop(); } } }