ブースト不変の流体力学的初期条件のためのフリーストリーミングとランダウマッチング。
freestream
、で説明されているように、ヘビーイオン衝突用の前平衡フリーストリーミングのPython実装です
単に実行します
ピップインストールフリーストリーム
唯一の要件は、numpy(1.8.0以降)とScipy(0.14.0以降)です。
考えられる問題:システムのロケールがUTF-8エンコードに設定されていない場合、 UnicodeDecodeError
が発生する可能性があります(このReadMeおよびコードドキュストリングのギリシャ文字のため)。これを解決するには、Localeを構成するか、 LANG
環境変数を設定するだけで、Eg export LANG=en_US.UTF-8
。
freestream
、 FreeStreamer
クラスを介してオブジェクト指向のインターフェイスがあり、3つのパラメーターが必要です。
freestream . FreeStreamer ( initial , grid_max , time )
どこ
initial
、初期状態を含む四角い配列です。grid_max
は、fmのグリッドのxとyの最大値、つまりグリッド幅の半分です(次の例を参照)、time
FM/Cでストリームを解放する時です。 initial
配列には、均一な平方グリッドに離散化された2次元(ブースト不変)初期条件を含める必要があります。次に、時間τ = 0+での非相互作用の質量のないパートンの密度プロファイルとして解釈されます。
grid_max
パラメーターは、グリッドの最も外側のエッジを設定します。外側のグリッドセルの中間点ではなく、
これは、Trento --grid-max
パラメーターと同じ定義です。
グリッドマックスを正しく設定して、上心臓の伝播を避けることが非常に重要です。
initial
、グリッド最大10.0 FMのN × N初期条件アレイであり、1.0 FMでストリームを解放する必要があるとします。最初にFreeStreamer
オブジェクトを作成します。
import freestream
fs = freestream . FreeStreamer ( initial , 10.0 , 1.0 )
これで、 fs
から水力を初期化するために必要なさまざまな量を抽出できます。
Tuv = fs . Tuv ()
Tuv
、各グリッドポイントに完全なテンソルを含むN × N ×3×3アレイです。テンソルの特定のコンポーネントのみが必要な場合は、インデックスを関数に渡すことができます。
T00 = fs . Tuv ( 0 , 0 )
T00
、各グリッドポイントにT 00を含むN × Nアレイです。これは純粋に構文の利便性のためです: fs.Tuv(0, 0)
fs.Tuv()[:, :, 0, 0]
に相当します。
e = fs . energy_density () # n x n
u = fs . flow_velocity () # n x n x 3
また、流速の個々のコンポーネントを抽出することもできます。
u1 = fs . flow_velocity ( 1 ) # n x n
繰り返しますが、これはfs.flow_velocity()[:, :, 1]
に相当します。
せん断圧テンソルπμνは、 Tμνのように機能します。
pi = fs . shear_tensor () # n x n x 3 x 3
pi01 = fs . shear_tensor ( 0 , 1 ) # n x n
バルク粘性圧力πは、状態p(e)の方程式に依存します。デフォルトでは、理想的なEOS P(E) = E /3が使用されます。
bulk = fs . bulk_pressure ()
バルク圧力は実際には理想的なEOSではゼロですが、数値精度のために小さな非ゼロ値があります。
別のEOSを使用するには、呼び出し可能なオブジェクトをbulk_pressure()
に渡します。
bulk = fs . bulk_pressure ( eos )
たとえば、補間をしたい圧力とエネルギー密度の表があるとします。 scipy.interpolate
使用してスプラインを構築し、それをbulk_pressure()
に渡すことができます。
import scipy . interpolate as interp
eos_spline = interp . InterpolatedUnivariateSpline ( energy_density , pressure )
bulk = fs . bulk_pressure ( eos_spline )
グリッドサイズに応じて、コードは数秒で実行する必要があります。計算時間は、グリッドセルの数に比例します(つまり、 2 )。
グリッドが放射状の膨張に対応するのに十分な大きさであることを確認してください。コードはオーバーフローをチェックしません。
FreeStreamer
内部配列への参照を返しますので、それらを設置しないでください - コピーを作成してください!
FreeStreamer
、2次元の立方体スプライン(scipy.interpolation.rectbivariatespline)を使用して、個別のグリッドから連続初期条件プロファイルを構築します。グリッド間隔が十分に小さい場合、これは非常に正確です。スプラインは、鋭い境界周辺で非常にわずかに負になることがあります。 FreeStreamer
、これらの負の値をゼロに強制します。
スクリプトtest.py
には単体テストが含まれており、定性的検査の視覚化が生成されます。テストを実行するには、鼻を取り付けて実行します。
nosetests -v test.py
2つのユニットテストがあります。
これらのテストは、ランダムなコンポーネントがあり、許容範囲がやや厳しいため、時々失敗します(すべてのグリッドポイントは0.1%以内に一致する必要があります)。テストが失敗すると、比率のリスト(観測/予想)が印刷されます。通常、障害は、システムが非常に希釈している最も外側のグリッドセルで発生し、そこでさえ〜0.2%しか逃しません。
視覚化を生成するには、 test.py
2つの引数、視覚化するテストケースとPDF出力ファイルを含むスクリプトとして実行します。 3つのテストケースがあります。
gaussian1
、起源を中心とした狭い対称ガウス。gaussian2
、原点からのより広い非対称ガウスオフセット。random
、ランダムに生成された初期条件(これは決して現実的ではなく、視覚化のみです)。例えば:
python test.py gaussian1 freestream.pdf
gaussian1
テストケースを実行し、 freestream.pdf
で結果を保存します。 PDFには、初期状態の視覚化とFreeStreamer
計算するすべてのものが含まれています。各視覚化では、赤い色が正の値を示し、青は負の意味を意味し、アレイの最大絶対値は左上に注釈が付けられます。
付属のスクリプトanimate.py
、HDF5形式(Trentoイベントなど)で保存された初期条件から(このページの上部にあるような)アニメーションを生成します。 MatplotlibとH5pyを搭載したPython3が必要であり、もちろんfreestream
をインストールする必要があります。トレントイベントをアニメーション化するには、最初にHDF5形式でいくつかのイベントを生成し、スクリプトを実行します。
TRENTO PB PB 10 -O Events.hdf ./anime.py events.hdf event_0 freestream.mp4
最初の引数はHDF5ファイル名、2つ目はアニメーションのデータセット、最後はアニメーションファイル名です。 run ./animate.py --help
アニメーション期間、フレームレート、コロマップなどのオプションを含む詳細については。