ガラスは本当に固体か? −コンピュータシミュレーションと情報理論による予測−
http://www.kyoto-u.ac.jp/ja/research/research_results/2014/150122_1.html
元論文を読むと、1300個のビリヤード球の衝突の計算で結果を出されてます。腕に憶えのあるプログラマは挑戦してみては?
その道筋を書いときます。
1:玉の衝突の計算
半径1の玉を箱の中で動かします。壁があるとしてもいいし、壁に来たら反対から出てくるドラクエ式でもいい。
まずは時間DTだけ進めて速度*DTだけ玉を動かし、DTのうちに壁にぶつかるかどうかを判定し、ぶつかるなら、衝突する時間まで時間を進めて玉を壁にひっつけ、そこで速度を反転させます。
#define DIM 2 double pos[DIM], v[DIM]; double min[DIM],max[DIM]; double pos_new[DIM]; double dt; ... while(1){ double t_hit= dt; int hit_flag= -1; for(m=0;m<DIM;m++) { pos_new[m]=pos[m]+v[m]*dt; if(pos_new[m]<min[m]) { double tt = -(pos[m]-min[m])/v[m]; if(hit_flag==-1 || tt<t_hit) { t_hit = tt; hit_flag = m; } } if(pos_new[m]>max[m]) { double tt = (max[m]-pos[m])/v[m]; if(hit_flag==-1 || tt<t_hit) { t_hit = tt; hit_flag = m; } } }//m for(m=0;m<DIM;m++) pos[m] += t_hit * v[m]; if (hit_flag!=-1) v[hit_flag] = -v[hit_flag]; }//while
2:玉を増やす
二個以上に玉を増やします。玉同士の衝突も判定します。玉の中心同士の距離が2以下になるかどうかで判定。
玉同士、玉と壁などそれぞれ判定し、ぶつかるのがあるなら、一番早い時間にぶつかるイベントを見つけます。
その時間まで時間を進めて、衝突による速度の反転処理を行います。
玉iが場所Riにいて速度Viの時(R,Vはベクトル)、玉iとjが衝突する時間tは(Ri-Rj +t(Vi-Vj))^2=2^2 という二次方程式を解いてtの小さいほうの解からわかります。解がないときは衝突なし。
これで完成
#define N 100 #define Sq(x) ((x)*(x)) // position, velocity, radius double pos[N][DIM], v[N][DIM], r[N]; ... double tmin = dt; int imin=-1, jmin=-1; for(i=0;i<N;i++) { for(j=0;j<i;j++) { double a = 0.0; double b = 0.0; double c = -Sq(r[i]+r[j]); for(m=0;m<DIM;m++) { double dp = pos[i][m] - pos[j][m]; double dv = v[i][m] - v[j][m]; a += dv*dv; b += 2*dv*dp; c += dp*dp; } double det = b*b - 4*a*c; if(det<0.0) continue; if(a < 1.0e-10)continue; //課題:sqrtの計算回数を極力減らす工夫をせよ double t_c = (-b -sqrt(det))/(2*a); if(t_c > 0.0 && t_c < tmin) { tmin = t_c; imin=i; jmin=j; } }//j }//i
3実験
二次元でも三次元でもいいけど、箱に玉を隙間無くぎっしり詰めます。そして玉の半径を0.99倍にして、各玉にランダムな速度を与えます。
ガチガチガチガチとぶつかりまくります。しかし回りを玉に囲まれてるんで、同じ場所で振動する感じです。
速度を変更せず、更に半径を少し縮めます。動ける範囲は少し広がるけど、やっぱりガチガチです。
どんどん小さくしていくと、ある所で急にブワーっとグチャグチャになるはずです。これが固体・液体の相転移。
これを実際の高分子の玉でやったのがこの実験
http://physicsworld.com/cws/article/news/2012/oct/05/tiny-spheres-simulate-crystal-melting
実験2
液体の状態から、逆に玉の半径を徐々に増やしていきます。減らすのより若干別の処理がいるかも。どこかで、かたまって固体になってガチガチになるはず。
実験3
液体の状態で、玉の半径を若干ばらつかせて、大きいのや小さいのがあるようにします。ここから玉の半径を、互いの比率は保ったままで徐々に大きくしていきます。どこかでガチガチになるけど、きれいに揃えない。これがガラス。
動画を発見。固まるところまでいってませんが。