目次
1.取り敢えず動かしてみよう。
2.引数ファイルを書き換えてみよう。(中級者向け)
3.出力ファイルの読み方(上級者向け)
4.エラーについて(上級者向け)
5.サポート
シミュレーションはJavaを使用しております。従って、実行環境を持っていない場合は実行できません。以下はJavaの実行環境があるものとして進めます。
まず、同封のClockSim.jarをダブルクリックして起動してください。それで開かない場合、適切にJARファイルが関連付いていないと思われますので、各自対処してください。
開くと、以下のようにウィンドウが出ます。(ウインドウを一つでも閉じると終了します。)

最初に出力先を聞いてくるので、以下のようにtest/datと入力しましょう。入力は上図の右にあるウインドウ(以下、コンソールと呼ぶ。もしOSのコンソールでプログラムを実行した場合は、このコンソールは生じない。その場合はOSのコンソールを通して通常通り入力を行う)の下部に焦点を合わせて行います。
WindowOpens.
Input: the Beginning of the Names of the Files to be Created.
>test/dat
以下、&gr;○○○という行は○○○と入力することを意味しています(その他の行はコンソール上部に出力されるメッセージです)。
この次には『引数ファイル』を聞いてきますので、sample.txtと入力しましょう。
Input the Relative URL of the Argument File to Use.
>sample.txt
最後に、シミュレーションで用いるウインドウの横幅をpx単位で聞かれます。
例えば、520と入力しましょう。
Input (the Width)/px.
>520
Notice: Then 1cm=57.77777777777778px.
Notice: Then (the Height of the Window)=577.7777777777778px.
すると、以下のように左に初期状態が生成されます。

最後に左ウインドウ(以下、スクリーン)をクリックしてSPACEキーで開始します。
SPACEキーでいつでも一時停止できます。
左下に表示されるシミュレーション内の時間が0.15s程度になりましたら、先ほど出力先と指定したtestフォルダが在る筈なので、これを開いてください。数枚の画像と1枚のテキストが有ると思います。
テキストは中身が空ですが、シミュレーションを終了すると中身が書き込まれます。
尚、このパラメータで計算すると、15s程度を周期とするクロック現象が見えると思います。
トップに戻る。
引数ファイルの例である
sample.txtを開いてみましょう。
ここで、/*と*/に囲まれた部分と、//より右の部分は何を書いても影響しません。
これらはコメントアウトされています。形式はJavaと同じです。
W = 9; //容器の幅
H = 10; //容器の高さ
dt = 1.0e-6; //時間の刻み幅
Rmode = 1; //0:通常、1:緩いカット、2:厳しいカット
R0 = 0.075; //半径
N0 = 80; //数
R1 = 0.1375; //半径
N1 = 20; //数
数字はcm,s,gの組立単位での数値部分で指定します。第一行は、容器の横幅Wを9cmと
設定します。
各代入文の後に半角セミコロン;を打つのを忘れないでください(エラーを起こします)。
念のため断っておきますと、1.0e-6は1.0*10^-6、つまり0.000001です。代入文の順番は自由です。
dtはこれより大きくすると計算が発散します。
R0,N0は0番目の種類の粒子の半径と数です。使いたい種類だけR1,R2,R3, ... を用いることが出来ますが、
間に使わない番号があってはいけません(例えば0,1,2,8,9,10番目の種類のみを定義して使おうとすると、
2番目の種類までしか読み込めません)。また、個数を小数にしてはいけません。
kt = 0; //仮想的接線方向発条定数
mu = 0; //動摩擦係数
A = 3.5e-7; //散逸の大きさ
これらは粒子同士の衝突時の振る舞いを決めます。ktとmuは摩擦に対応します。
ktは5.0e5程度、muは0.3程度が適切です。
粒子の反発係数はAで決まります。シミュレーション実行時に次のような表示が出たと思います。
Typical COR(0,0)=0.8970812768910481
Week COR(0,0)=0.933023687767378
Typical COR(0,1)=0.9121436452695812
Week COR(0,1)=0.9429031770313778
Typical COR(1,1)=0.9418507252049322
Week COR(1,1)=0.9627090742316174
第一行は典型的な速さで第0種の粒子と第0種の粒子が衝突した場合の反発係数を表します。
二行目はそれより遅い速度での反発係数です。
#Hw = 2; //壁の高さ
#Xw = W/2; //壁のX座標
init_area=[3*R0,3*R0,W-3*R0,H-#Hw-3*R0];
wall0=[0,H-R0,W+R0,H-R0];
wall1=[R0,0,R0,H];
wall2=[W,0,W,H];
wall3=[#Xw,H-#Hw,#Xw,H];
detect0=[0,0,#Xw,H];
代入文の右辺には別の行(上下問わず)で定義した変数や四則演算を利用できます。例えば、W=8.0;H=W*1.2;という
入力は有効です。ただし定義に循環があってはなりません。また、好きに変数を定義できます。#Hwと#Xwは
プログラム自体に求められていません(従ってこのファイル中の#Hwを全て別の文字列、例えばFooに
書き換えても動作に影響しません)。
init_area=[X0,Y0,X1,Y1];は粒子の初期位置を点(X0,Y0)と点(X1,Y1)の作る長方形の内部に取る事を
意味します。ここでy座標は画面上で下方向を正とします。空間は各方向でループします。
次にwall0=[X0,Y0,X1,Y1];は点(X0,Y0)と点(X1,Y1)を結ぶ線分上に壁を設けます。壁は第0種の粒子を
並べて作っています。壁は何個でも設けられます(wall1,wall2, ... )。
最後にdetect0=[X0,Y0,X1,Y1];は点(X0,Y0)と点(X1,Y1)の作る長方形の内部を領域0と名付けています。
領域は幾つでも設けられます(detect1, ... )。detectNまで定義した場合、その何れにも属さない領域は領域(N+1)と
なり、こうして空間の各点は何らかの領域に分類されます。
参考。
sample.txtで触れていない変数としてprcsがあります。例えばprcs=3;とすると三列で並列計算します。
デフォルトではPC上のプロセサの数になります。また、Nimgは保存する画像の枚数(デフォルト6000)を、
intは何回の計算に一度、画面を切り替えるのか(デフォルト1500)を、
output_rateは何回の画面の切り替えに一回、画像を保存し出力テキストに書き込むのか(デフォルト16)
を指定します。
引数ファイルは複数指定できます。例えば以下の様にです。
Input: the Beginning of the Names of the Files to be Created.
>
Input the Relative URL of the Argument File to Use.
>sample.txt option.txt W=15 H=10
実は、引数ファイルでなく直接に代入文を書くことも可能です。
この様な場合、右にあるものほど優先されます(例えばsample.txtにN0=15とありoption.txtにN0=18と
ある場合、第0種の粒子は18個となります)。
なお、上では出力先を指定しないことで出力しないようにしています。
トップに戻る。
出力されたtxtには、(1)入力された引数の情報、
(2)エラー情報、(3)数値、の三種がかかれます。
ここで(3)の例を見ましょう。
0.0225,-1.613249219375165E-4,0.43194436716612955,(以下略)
数字は順に以下のようになります。単位はcm,g,sの組立です。
(時刻t),(壁のy方向への変位),
(第0領域にある第0種粒子の平均内部並進エネルギー),
(...の粒子数のべ重心並進エネルギー),(...の平均回転エネルギー),
(...の平均y座標),(...の個数),
(第1領域にある第0種粒子の平均内部並進エネルギー),
(...の粒子数のべ重心並進エネルギー),(...の平均回転エネルギー),
(...の平均y座標),(...の個数),
...,
(第M領域にある第0種粒子の平均内部並進エネルギー),
(...の粒子数のべ重心並進エネルギー),(...の平均回転エネルギー),
(...の平均y座標),(...の個数),
(第0領域にある第1種粒子の平均内部並進エネルギー),
(...の粒子数のべ重心並進エネルギー),(...の平均回転エネルギー),
(...の平均y座標),(...の個数),
(第1領域にある第1種粒子の平均内部並進エネルギー),
(...の粒子数のべ重心並進エネルギー),(...の平均回転エネルギー),
(...の平均y座標),(...の個数),
...,
(第M領域にある第1種粒子の平均内部並進エネルギー),
(...の粒子数のべ重心並進エネルギー),(...の平均回転エネルギー),
(...の平均y座標),(...の個数),
...
(第M領域にある第N種粒子の平均内部並進エネルギー),
(...の粒子数のべ重心並進エネルギー),(...の平均回転エネルギー),
(...の平均y座標),(...の個数),
これを用いて解析できます。
トップに戻る。
以下の画像はdt=1.0e-4として作為的に問題を起こしたものである。

さて、シミュレーション上のエラー(誤差)、及びエラーが支配的な現象/状況は以下の2種が挙げられる。
(0)まず上の画像のように右下に
!が表示される状況。
これは粒子間の反発が計算に持ち込まれる前に粒子が重なってしまった場合で、(恐らく以下の(1)によって)速度が大きすぎる時に
起きてしまう。尚、シミュレーション開始時にも起きるが、これは問題が無い。以下のメッセージはこの問題の発生と解決を表している。500回以上はメッセージは表示されない。
#NOTICE: 9 PAIRS IN TROUBLE at the turn 1(1.0E-6s).
#NOTICE: ALL THE PAIRS GOT SAFE at the turn 13588(0.013588s).
(1)計算の誤差が積もって速度平均が指数関数的に増大し、発散する問題。これはdtが大き過ぎる事に因る。上の画像は問題(0)と共にこの問題を起こしている。
トップに戻る。