Kostenloses Streaming und Landau-Matching für die anfänglichen Ausgangsbedingungen für Boost-invariante hydrodynamische.
freestream
ist eine Python-Implementierung von voräquilibriumfreiem Streaming für schwere Ionen-Kollisionen, wie in beschrieben
Einfach rennen
PIP Freestream installieren
Die einzigen Anforderungen sind numpy (1,8.0 oder höher) und scipy (0,14,0 oder höher).
Mögliches Problem: Ein UnicodeDecodeError
kann auftreten, wenn das Systemgebietsschema nicht auf eine UTF-8-Codierung eingestellt ist (aufgrund der griechischen Zeichen in diesem Readme und dem Code-Dokument). Um dies zu beheben, konfigurieren Sie das Gebietsschema oder legen Sie einfach die LANG
Umgebungsvariable, z. B. export LANG=en_US.UTF-8
.
freestream
verfügt über eine objektorientierte Schnittstelle durch die FreeStreamer
-Klasse, die drei Parameter erfordert:
freestream . FreeStreamer ( initial , grid_max , time )
Wo
initial
ist ein Quadrat -Array, das den Ausgangszustand enthält.grid_max
ist das maximale X und Y maximal des Gitters in FM, dh die Hälfte der Gitterbreite (siehe folgendes Beispiel).time
ist die Zeit, den Stream in FM/c zu befreien. Das initial
Array muss eine zweidimensionale (Boost-invariante) Anfangsbedingung enthalten, die auf einem gleichmäßigen quadratischen Gitter diskretisiert ist. Es wird dann als Dichteprofil von nicht interagierenden massenlosen Partons zum Zeitpunkt τ = 0+ interpretiert.
Der Parameter grid_max
legt die äußerste Kante des Gitters fest, nicht den Mittelpunkt der äußeren Gitterzelle, z. B.
Dies ist die gleiche Definition wie der Parameter Trento --grid-max
.
Es ist sehr wichtig, dass das Raster Max korrekt eingestellt ist, um eine superluminale Ausbreitung zu vermeiden.
Nehmen wir an, initial
ist ein N × N -Ausgangsbedingungsarray mit einem Gitter max von 10,0 FM, und wir möchten den Strom für 1,0 FM freigeben. Wir erstellen zuerst ein FreeStreamer
-Objekt:
import freestream
fs = freestream . FreeStreamer ( initial , 10.0 , 1.0 )
Wir können jetzt die verschiedenen Größen extrahieren, die zur Initialisierung von Hydro aus fs
erforderlich sind.
Tuv = fs . Tuv ()
Tuv
ist ein N × N × 3 × 3 -Array, das den vollen Tensor an jedem Gitterpunkt enthält. Wenn wir nur eine bestimmte Komponente des Tensors wollen, können wir Indizes an die Funktion übergeben:
T00 = fs . Tuv ( 0 , 0 )
T00
ist ein N × N -Array, das an jedem Gitterpunkt T 00 enthält. Dies gilt nur für syntaktische Bequemlichkeit: fs.Tuv(0, 0)
entspricht fs.Tuv()[:, :, 0, 0]
.
e = fs . energy_density () # n x n
u = fs . flow_velocity () # n x n x 3
Wir können auch die einzelnen Komponenten der Durchflussgeschwindigkeit extrahieren:
u1 = fs . flow_velocity ( 1 ) # n x n
Auch dies entspricht fs.flow_velocity()[:, :, 1]
.
Der Scherdruck -Tensor π μν funktioniert genau wie T μν :
pi = fs . shear_tensor () # n x n x 3 x 3
pi01 = fs . shear_tensor ( 0 , 1 ) # n x n
Der viskose Druck π hängt von der Gleichung des Zustands P (e) ab. Standardmäßig wird der ideale EOS P (e) = E /3 verwendet:
bulk = fs . bulk_pressure ()
Der Schüttdruck ist in der Tat mit den idealen EOs Null, aber aufgrund der numerischen Präzision werden kleine Werte ungleich Null vorliegen.
Um ein anderes EOS zu verwenden, übergeben Sie ein Callable -Objekt an bulk_pressure()
:
bulk = fs . bulk_pressure ( eos )
Nehmen wir beispielsweise an, wir haben eine Druck- und Energiedichte, die wir interpolieren möchten. Wir können scipy.interpolate
verwenden, um einen Spline zu konstruieren und an bulk_pressure()
zu übergeben:
import scipy . interpolate as interp
eos_spline = interp . InterpolatedUnivariateSpline ( energy_density , pressure )
bulk = fs . bulk_pressure ( eos_spline )
Der Code sollte je nach Gittergröße in wenigen Sekunden ausgeführt werden. Die Rechenzeit ist proportional zur Anzahl der Netzzellen (dh N 2 ).
Stellen Sie sicher, dass das Netz groß genug ist, um die radiale Expansion aufzunehmen. Der Code prüft nicht nach Überlauf.
FreeStreamer
gibt Verweise auf seine internen Arrays zurück. Ändern Sie sie also nicht an Ort und Stelle - machen Sie Kopien!
FreeStreamer
verwendet einen zweidimensionalen kubischen Spline (scipy.interpolat.RectBivariatespline), um ein kontinuierliches Anfangszustandsprofil aus einem diskreten Gitter zu konstruieren. Dies ist sehr präzise, sofern der Netzabstand klein genug ist. Der KLINE gilt manchmal leicht negativ um scharfe Grenzen; FreeStreamer
zwingt diese negativen Werte auf Null.
Der Skript test.py
enthält Unit -Tests und generiert Visualisierungen für die qualitative Inspektion. Um die Tests auszuführen, installieren Sie die Nase und rennen Sie:
NoSetests -v test.py
Es gibt zwei Unit -Tests:
Diese Tests scheitern gelegentlich, da es eine zufällige Komponente gibt und die Toleranz etwas streng ist (jeder Netzpunkt muss innerhalb von 0,1%zustimmen). Wenn ein Test fehlschlägt, wird eine Liste von Verhältnissen (beobachtet/erwartet) ausgedruckt. Typischerweise treten die Fehler in der äußersten Gitterzelle auf, in der das System sehr verdünnt ist, und selbst dort wird es nur um ~ 0,2%verpasst.
Um Visualisierungen zu generieren, führen Sie test.py
als Skript mit zwei Argumenten aus, dem Testfall zur Visualisierung und einer PDF -Ausgabedatei. Es gibt drei Testfälle:
gaussian1
, ein schmaler symmetrischer Gaußscher, der auf den Ursprung zentriert ist.gaussian2
, ein breiterer asymmetrischer Gaußscher Versatz aus dem Ursprung.random
, eine zufällig erzeugte Anfangsbedingung (dies ist in keiner Weise realistisch, sondern nur zur Visualisierung).Zum Beispiel:
Python test.py Gaußsian1 freestream.pdf
Führen Sie den gaussian1
Testfall aus und speichern die Ergebnisse in freestream.pdf
. Das PDF enthält Visualisierungen des Anfangszustands und alles, was FreeStreamer
berechnet. In jeder Visualisierung zeigen rote Farben positive Werte an, blau bedeutet negativ, und der maximale absolute Wert des Arrays wird in der oberen linken Annotation annotiert.
Das enthaltene Skript animate.py
generiert Animationen (wie oben auf dieser Seite) aus den Anfangsbedingungen, die im HDF5 -Format gespeichert sind (z. B. Trento -Ereignisse). Es erfordert Python3 mit Matplotlib und H5Py, und natürlich muss freestream
installiert werden. Um ein Trento -Ereignis zu animieren, generieren Sie zunächst einige Ereignisse im HDF5 -Format und führen Sie das Skript aus:
Trento PB PB 10 -o Ereignisse.hdf ./animate.py events.hdf event_0 freestream.mp4
Das erste Argument ist der HDF5 -Dateiname, das zweite ist der Datensatz, der animiert ist, und der letzte der Animations -Dateiname. Run ./animate.py --help
für weitere Informationen, einschließlich Optionen für die Animationsdauer, Framerate, Colormap usw.