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 3Kami 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 nTekanan 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.