= 多粒子系のシミュレーション = <> == 目的 == == コード == github/tkono17/labpp/PSystemにPythonのコードがある。 {{{ git clone https://github.com/tkono17/labpp.git }}} || '''ファイル''' || '''内容''' || || python/dss.py || 粒子系のシミュレーション(粒子と境界、時間発展) || || python/dsgui.py || 結果を表示するためのGUI ||| || scripts/runds1.py || 粒子系を設定して実行するためのプログラム || == シミュレーションの設定と拡張 == python/dss.pyの中のSystemConfigクラスに、設定できるパラメータがある。ここで、生成する粒子の種類や個数等を設定できる。 現状では円形の自由粒子が、弾性衝突をするという状況しか計算していない。(workdirのなかでemacs labpp/PSystem/scripts/runds1.pyのなかで粒子の種類、個数みれる) 粒子にはたらく力や複雑な境界を定義したければPSystemクラスを拡張する必要がある。 == ソフトウェアの導入方法 == 作業用のディレクトリを作る。以下では、このディレクトリをと呼ぶことにする。 実際には、自分が好きなディレクトリ名を決めて以下のの部分はその名前で置き換えること。 {{{ cd git clone https://github.com/tkono17/labpp.git mkdir build sw cat > setup.sh </sw export PATH=${SWDIR}/bin:${PATH} export LD_LIBRARY_PATH=${SWDIR}/lib:${LD_LIBRARY_PATH} export PYTHONPATH=${SWDIR}/python:${PYTHONPATH} EOF cd build cmake ../labpp/PSystem make install }}} これをやった後には、の下にsw, build, labpp, setup.shといったディレクトリやファイルができているはずである。 新しくターミナルをシェルを立ち上げて作業を開始前に以下を実行する。 {{{ cd source ./setup.sh }}} このソフトウェアはpythonなのでコンパイルは不要であるが、必要なファイルを/swの下にインストールするために {{{ cd /build make install }}} を実行する。これでプログラムを走らせる環境が整う。 一度ログアウトした後で再度ログインした場合には、いつものように環境設定のために以下を実行する。 {{{ cd source setup.sh }}} プログラムを実行するには {{{ source setup.sh cd /run runds1.py }}} を実行する。すると、以下のようなウィンドウが新しく立ち上がるはずである。 {{attachment:dsgui.png||width=600}} Initialize -> Start -> Stop -> Quitが一連の流れになる。 || '''ボタン''' || '''内容''' || || Initialize || 初期状態の生成 || || Start || 系の時間発展 || || Stop || 時間発展の停止 || || Quit || プログラムの終了 || == データファイルの解析 == シミュレーションを実行するとjson形式のデータファイルが生成される。Jsonファイルはデータを木構造で表現したもので、階層的なデータ構造を表現するのに便利である。ファイルの中のデータにアクセルするには、例えばPythonでは以下のようにする。 {{{ python3 import json f = open('dss.json', 'r') data = json.load(f) data['events'][2]['balls'][1]['momentum'] }}} 上のコードでは、(1)jsonライブラリのインポート、(2)dss.jsonという名前のファイルを開く、(3)ファイル内のjsonデータを読み込んでdataに代入、(4)時刻[2]のときのボール[1]の運動量というデータにアクセスする、ということをやっている。 このデータを使って、より詳細なデータ解析をするためには、Json形式(木構造)によるデータ構造、その中の特定のデータにアクセスする方法に慣れる必要がある。 == 課題 == シミュレーションを実行するとdss.jsonというファイルが生成される。これは各時刻における粒子の位置、運動量を記録したものである。 この出力結果を元に解析をする。何を調べるかはこれから考える。 1. 各時刻で系の全エネルギーを計算して、その時間発展を調べる。(エネルギー保存も調べる) * 弾性衝突のみなら、エネルギーは保存するはずである。保存しない場合は数値的な不安定性がある可能性がる。 1. 他にも系を特徴づける量を考えて、その量を計算して時間発展を調べる。 * 個々の粒子のエネルギー、運動量、密度等。ボルツマン分布に従うようになるか。 1. 質量の異なる2種類の粒子を入れるとどうなるか、系に存在する粒子の個数を変えるとどうなるか。 さらにシミュレーションの内容を発展させるためには、系の運動法則を変えてみる。 1. 重力場中でシミュレーションをさせる。 * 最後は全部下に集まって停止する? 1. 壁で反射する度に、エネルギーを増減させる(熱浴との接触)。 * 下から熱して、上で冷ますと対流のような現象が起きるか。 1. 粒子間にポテンシャルを導入する。1/r^2型、Lennard-Jonnes型ポテンシャル等。ポテンシャルの到達距離または密度を変えてみる。 * いわゆる分子動力学のようなもの。気体っぽい性質や液体っぽい性質が現れるか。