日本語練習帳

つらみのラプソディを歌います

修論 #2

今日は修論と関係のない話題で恐縮です.

PRE論文『Nonequilibrium phase transition in an exactly solvable driven Ising model with friction』について

内容については,出版社及びarXivからどうぞ.

journals.aps.org

[0909.0533] Non-equilibrium phase transition in an exactly solvable driven Ising model with friction

研究始めたての頃に目を通した時は,boundary magnetizationの計算で何故平均場近似が正当化されるのかなどと言って,数式を追うことに耽溺して結局読めなかった.しかし,この前目を通したらあっさり読めてしまい,「なるほど〜」と声が出たので,簡単にまとめておく.

  • 速度$v$である滑り面に沿って相対運動する2体の等価なIsing模型を考える(格子の次元・形状は任意).
  • $v \to \infty$の場合には,滑り面における磁化$m$があるランダム変数$\mu$による期待値で書かれ,滑り面に沿う方向の並進対称性から平均場の描像が成立する.
  • この手続によると,自己無到着方程式を任意の格子で書き下すことが出来る.よって,モンテカルロ・シミュレーションに頼らなくても,(方程式を解く際の)数値誤差の範囲で非平衡相転移の相図を得ることが出来る.
  • 非平衡相転移は,$v \to \infty$における有限の$T_{c}>0$で特徴付けられる.例えば,1次元のIsingスピン鎖が2本動いている場合には,実は(ある変数$\mathrm{e}^{-K}$の2次方程式が出現する都合上)2次元Ising模型と同じ転移点で相転移を起こすことが分かる.
  • 一方,スピンフリップによるエネルギー散逸のダイナミクスも「フリップ確率が2体スピンの相関の積で書ける」という特殊な可解性を課すと厳密に分かる1.この可解なダイナミクスに用いられる確率は"multipricative rate"と呼ばれる(日本語的には「掛け算式レート」かな).

やはり,数値実験に寄り添う分野だと,ある程度モンテカルロ・シミュレーション以外のこともきちんと遂行できて初めて論文になるのかなという印象を受けた.まあ,物理だから当然なのかも知れない.

Fortranで汎用ライブラリに変数空間を汚染される話

試しに,こんなソースコードコンパイルしたいとしよう.

PROGRAM main
  USE ifport
  IMPLICIT NONE

  INTEGER(kind = 4) :: stat_acc

  stat_acc = access("test.dat", " ")
  CALL system("echo hogehoge")
END PROGRAM main

ざっくり言うと,実行元ディレクトリにtest.datという名前のファイルが有るかどうかを調べるために,access()という標準では組み込まれない組み込み関数を用いて,状態を変数stat_accに格納し,その直後にシステムコールを用いてhogehogeという文字列をunix terminalから出力させようというプログラムだ.動機なんてどうでもいい2.ただ,それぞれの目的のために,あれこれを読み,何も考えずに実装しただけだ.

dynamicsoar.hatenablog.com

slpr.sakura.ne.jp

これをIntel Fortran Compilerにぶち込むと,次のようなエラーを吐く.

$ ifort test.f90 -o test
test.f90(8): error #6552: The CALL statement is invoking a function subprogram as a subroutine.   [SYSTEM]
  CALL system("echo hogehoge")
-------^
compilation aborted for test.f90 (code 1)

最初,エラー・メッセージでググっても何のことやらさっぱ分からなかったが,少し考えて,ある可能性に行き着いた.

「ひょっとして,system()という名の関数がifportから呼ばれている…?」

system()は,システムコールをやる時はsubroutineである.当然である.しかし,IFPORTモジュールにはどうやらfunctionとしてcontainされているみたいで,まあ結論から言えば名前が被ってしまったみたいだ.

これがもしmodule変数ならば,moduleの開発者側がprivate属性なりなんなりで隠蔽することが出来るが,subroutine名やfunction名だと引用する側がonlyなどで防がないことにはどうしようもない.よく言われるのは,「module側から隠蔽するのは性悪説,main文から必要最小限のもの以外は参照しないのは性善説に基づく実装だ」という話だけど,ちょっと今回のはsystem()というfunction名はセコいかなと思ったりした.

というわけで,呼びたい手続き(ここではaccess())だけをonly文で引くように,次のように書き換える.

PROGRAM main
  USE ifport, only: access
  IMPLICIT NONE

  INTEGER(kind = 4) :: stat_acc

  stat_acc = access("test.dat", " ")
  CALL system("echo hogehoge")
END PROGRAM main

こうすることで,無事にコンパイルも通り,実行結果もまともになる.幸あれ.

$ ifort test.f90 -o test
$ ./test
hogehoge

  1. 通常のモンテカルロ・シミュレーション(例えばGlauber確率やMetropolis確率に従ってシングルフリップ時間発展する場合)では,あるスピンがフリップする確率は,常に格子次元$d$に応じた複数個の隣接スピン全ての配位で確定する.よって,多体相関の影響で有効的に時間発展が加速されていると考えることが出来る.その最たるものがクラスター・アルゴリズムだか何だかだ.逆に言えば,この論文で手で解けるように導入されたmultiprivative rateをモンテカルロ・シミュレーションに導入すると,ダイナミクスはGlauber確率やMetropolis確率のそれと比べると2倍程度遅くなるということが,彼ら自身によって指摘されている(論文ではacceptance rateの図で明確に示されている).

  2. 実際には,ちょっと複雑な処理を行う数値計算プログラムの実装のヤバいところを簡略化して記述したノンフィクションである.