Streaming gratis dan pencocokan Landau untuk kondisi awal hidrodinamik boost-invarian.
freestream
adalah implementasi Python dari streaming bebas pra-kesetimbangan untuk tabrakan ion berat, seperti yang dijelaskan dalam
Cukup jalankan
Pip Instal Freestream
Satu -satunya persyaratan adalah numpy (1.8.0 atau lebih baru) dan licik (0.14.0 atau lebih baru).
Kemungkinan masalah: UnicodeDecodeError
dapat terjadi jika lokasi sistem tidak diatur ke pengkodean UTF-8 (karena karakter Yunani dalam readme ini dan docstrings kode). Untuk menyelesaikannya, konfigurasikan lokasi atau cukup atur variabel lingkungan LANG
, misalnya export LANG=en_US.UTF-8
.
freestream
memiliki antarmuka berorientasi objek melalui kelas FreeStreamer
, yang mengambil tiga parameter:
freestream . FreeStreamer ( initial , grid_max , time )
Di mana
initial
adalah array persegi yang berisi keadaan awal,grid_max
adalah x dan y maksimum grid di fm, yaitu setengah lebar kisi (lihat contoh berikut),time
adalah waktu untuk membebaskan aliran di FM/C. Array initial
harus berisi kondisi awal dua dimensi (boost-invariant) yang didiskritisasi menjadi kisi persegi yang seragam. Ini kemudian ditafsirkan sebagai profil kepadatan dari parton yang tidak berinteraksi pada waktu τ = 0+.
Parameter grid_max
mengatur tepi terluar dari kisi, bukan titik tengah sel kisi luar, misalnya
Ini adalah definisi yang sama dengan parameter Trento --grid-max
.
Sangat penting bahwa max kisi diatur dengan benar untuk menghindari propagasi superluminal.
Misalkan initial
adalah array kondisi awal n × n dengan maks grid 10,0 fm dan kami ingin membebaskan aliran untuk 1,0 fm. Kami pertama -tama membuat objek FreeStreamer
:
import freestream
fs = freestream . FreeStreamer ( initial , 10.0 , 1.0 )
Kami sekarang dapat mengekstrak berbagai jumlah yang diperlukan untuk menginisialisasi hidro dari fs
.
Tuv = fs . Tuv ()
Tuv
adalah array N × N × 3 × 3 yang berisi tensor penuh di setiap titik kisi. Jika kita hanya menginginkan komponen tensor tertentu, kita dapat meneruskan indeks ke fungsi:
T00 = fs . Tuv ( 0 , 0 )
T00
adalah array n × n yang mengandung t 00 di setiap titik kisi. Ini murni untuk kenyamanan sintaksis: fs.Tuv(0, 0)
setara dengan fs.Tuv()[:, :, 0, 0]
.
e = fs . energy_density () # n x n
u = fs . flow_velocity () # n x n x 3
Kami juga dapat mengekstraksi komponen individu dari kecepatan aliran:
u1 = fs . flow_velocity ( 1 ) # n x n
Sekali lagi, ini setara dengan fs.flow_velocity()[:, :, 1]
.
Tensor tekanan geser π μν berfungsi seperti t μν :
pi = fs . shear_tensor () # n x n x 3 x 3
pi01 = fs . shear_tensor ( 0 , 1 ) # n x n
Tekanan kental curah π tergantung pada persamaan keadaan p (e) . Secara default, EOS P (E) = E /3 yang ideal digunakan:
bulk = fs . bulk_pressure ()
Tekanan curah sebenarnya nol dengan EOS yang ideal, tetapi akan ada nilai bukan nol yang kecil karena presisi numerik.
Untuk menggunakan EOS lain, berikan objek yang dapat dipanggil ke bulk_pressure()
:
bulk = fs . bulk_pressure ( eos )
Sebagai contoh, misalkan kita memiliki tabel tekanan dan kepadatan energi yang ingin kita interpolasi. Kita dapat menggunakan scipy.interpolate
untuk membangun spline dan meneruskannya ke bulk_pressure()
:
import scipy . interpolate as interp
eos_spline = interp . InterpolatedUnivariateSpline ( energy_density , pressure )
bulk = fs . bulk_pressure ( eos_spline )
Kode harus berjalan dalam beberapa detik, tergantung pada ukuran grid. Waktu perhitungan sebanding dengan jumlah sel grid (yaitu N 2 ).
Pastikan kisi -kisi cukup besar untuk mengakomodasi ekspansi radial. Kode tidak memeriksa overflow.
FreeStreamer
mengembalikan referensi ke array internalnya, jadi jangan memodifikasinya di tempat - buat salinan!
FreeStreamer
menggunakan spline kubik dua dimensi (scipy.interpolate.rectbivariateSpline) untuk membangun profil kondisi awal kontinu dari kisi diskrit. Ini sangat tepat asalkan jarak jaringan cukup kecil. Spline terkadang berjalan sedikit negatif di sekitar batas -batas tajam; FreeStreamer
memaksa nilai -nilai negatif ini menjadi nol.
Skrip test.py
berisi unit tes dan menghasilkan visualisasi untuk inspeksi kualitatif. Untuk menjalankan tes, pasang hidung dan jalankan:
nosetests -v test.py
Ada dua tes unit:
Tes -tes ini kadang -kadang gagal karena ada komponen acak dan toleransi agak ketat (setiap titik grid harus setuju dalam 0,1%). Ketika tes gagal, itu akan mencetak daftar rasio (diamati/diharapkan). Biasanya kegagalan terjadi pada sel grid terluar di mana sistem sangat encer, dan bahkan di sana hanya akan hilang sebesar ~ 0,2%.
Untuk menghasilkan visualisasi, jalankan test.py
sebagai skrip dengan dua argumen, test case untuk memvisualisasikan dan file output PDF. Ada tiga kasus uji:
gaussian1
, Gaussian simetris sempit yang berpusat pada asalnya.gaussian2
, offset Gaussian asimetris yang lebih luas dari asal.random
, kondisi awal yang dihasilkan secara acak (ini tidak realistis, itu hanya untuk visualisasi).Misalnya:
python test.py gaussian1 freestream.pdf
akan menjalankan case uji gaussian1
dan menyimpan hasil di freestream.pdf
. PDF berisi visualisasi dari keadaan awal dan semua yang dihitung oleh FreeStreamer
. Dalam setiap visualisasi, warna merah menunjukkan nilai positif, biru berarti negatif, dan nilai absolut maksimum array dianotasi di kiri atas.
Script animate.py
yang disertakan menghasilkan animasi (seperti yang ada di bagian atas halaman ini) dari kondisi awal yang disimpan dalam format HDF5 (misalnya acara Trento). Ini membutuhkan python3 dengan matplotlib dan h5py, dan tentu saja freestream
harus dipasang. Untuk menghidupkan acara Trento, pertama -tama hasilkan beberapa acara dalam format HDF5 kemudian jalankan skrip:
Trento PB PB 10 -O Events.hdf ./animate.py events.hdf event_0 freestream.mp4
Argumen pertama adalah nama file HDF5, yang kedua adalah dataset untuk menghidupkan, dan yang terakhir adalah nama file animasi. Jalankan ./animate.py --help
untuk informasi lebih lanjut termasuk opsi untuk durasi animasi, framerate, colormap, dll.