Transmisión gratuita y coincidencia de Landau para las condiciones iniciales hidrodinámicas invariantes de impulso.
freestream
es una implementación de Python de la transmisión libre de equilibrio antes del equilibrio para colisiones de iones pesados, como se describe en
Simplemente ejecutar
PIP Instale Freestream
Los únicos requisitos son Numpy (1.8.0 o posterior) y SciPy (0.14.0 o posterior).
Posible problema: puede ocurrir un UnicodeDecodeError
si la localidad del sistema no está configurada en una codificación UTF-8 (debido a los caracteres griegos en este readMe y las documentos de código). Para resolver esto, configure la configuración regional o simplemente establezca la variable de entorno LANG
, por ejemplo, export LANG=en_US.UTF-8
.
freestream
tiene una interfaz orientada a objetos a través de la clase FreeStreamer
, que toma tres parámetros:
freestream . FreeStreamer ( initial , grid_max , time )
dónde
initial
es una matriz cuadrada que contiene el estado inicial,grid_max
es el máximo x e y de la cuadrícula en fm, es decir, la mitad del ancho de la cuadrícula (ver ejemplo siguiente),time
es el momento de transmitir gratis en FM/C. La matriz initial
debe contener una condición inicial bidimensional (invariante) discretizada sobre una cuadrícula cuadrada uniforme. Luego se interpreta como un perfil de densidad de partones sin masas no interactuantes en el momento τ = 0+.
El parámetro grid_max
establece el borde más externo de la cuadrícula, no el punto medio de la celda de la cuadrícula externa, por ejemplo,
Esta es la misma definición que el parámetro Trento --grid-max
.
Es muy importante que la cuadrícula Max esté configurada correctamente para evitar la propagación superluminal.
Supongamos que initial
es una matriz de condición inicial N × N con una cuadrícula máxima de 10.0 FM y queremos transmitir libremente para 1.0 FM. Primero creamos un objeto FreeStreamer
:
import freestream
fs = freestream . FreeStreamer ( initial , 10.0 , 1.0 )
Ahora podemos extraer las diversas cantidades necesarias para inicializar Hydro de fs
.
Tuv = fs . Tuv ()
Tuv
es una matriz N × N × 3 × 3 que contiene el tensor completo en cada punto de referencia. Si solo queremos un determinado componente del tensor, podemos pasar índices a la función:
T00 = fs . Tuv ( 0 , 0 )
T00
es una matriz N × N que contiene T 00 en cada punto de cuadrícula. Esto es puramente para la conveniencia sintáctica: fs.Tuv(0, 0)
es equivalente a fs.Tuv()[:, :, 0, 0]
.
e = fs . energy_density () # n x n
u = fs . flow_velocity () # n x n x 3
También podemos extraer los componentes individuales de la velocidad de flujo:
u1 = fs . flow_velocity ( 1 ) # n x n
Nuevamente, esto es equivalente a fs.flow_velocity()[:, :, 1]
.
El tensor de presión de corte π μν funciona como t μν :
pi = fs . shear_tensor () # n x n x 3 x 3
pi01 = fs . shear_tensor ( 0 , 1 ) # n x n
La presión viscosa a granel π depende de la ecuación de estado P (e) . Por defecto, se usa el EOS P (E) = E /3 ideal:
bulk = fs . bulk_pressure ()
La presión a granel es de hecho cero con el EOS ideal, pero habrá pequeños valores distantes de cero debido a la precisión numérica.
Para usar otro EOS, pase un objeto llamable a bulk_pressure()
::
bulk = fs . bulk_pressure ( eos )
Por ejemplo, supongamos que tenemos una tabla de presión y densidad de energía que queremos interpolar. Podemos usar scipy.interpolate
para construir una spline y pasarla a bulk_pressure()
::
import scipy . interpolate as interp
eos_spline = interp . InterpolatedUnivariateSpline ( energy_density , pressure )
bulk = fs . bulk_pressure ( eos_spline )
El código debe ejecutarse en unos segundos, dependiendo del tamaño de la cuadrícula. El tiempo de cálculo es proporcional al número de células de la cuadrícula (es decir, n 2 ).
Asegúrese de que la cuadrícula sea lo suficientemente grande como para acomodar la expansión radial. El código no verifica el desbordamiento.
FreeStreamer
devuelve referencias a sus matrices internas, así que no las modifique en su lugar, ¡haga copias!
FreeStreamer
utiliza una spline cúbica bidimensional (scipy.interpolate.rectbivariatespline) para construir un perfil de condición inicial continua a partir de una cuadrícula discreta. Esto es muy preciso, siempre que el espaciado de la cuadrícula sea lo suficientemente pequeño. La spline a veces se vuelve muy ligeramente negativa alrededor de los límites afilados; FreeStreamer
coacciona estos valores negativos a cero.
El script test.py
contiene pruebas unitarias y genera visualizaciones para la inspección cualitativa. Para ejecutar las pruebas, instale la nariz y ejecute:
nosetests -v test.py
Hay dos pruebas unitarias:
Estas pruebas ocasionalmente fallan ya que hay un componente aleatorio y la tolerancia es algo estricta (cada punto de cuadrícula debe estar de acuerdo dentro del 0.1%). Cuando una prueba falla, imprimirá una lista de proporciones (observadas/esperadas). Por lo general, las fallas ocurren en la celda de la cuadrícula más externa donde el sistema está muy diluido, e incluso allí solo se perderá en ~ 0.2%.
Para generar visualizaciones, ejecute test.py
como un script con dos argumentos, el caso de prueba para visualizar y un archivo de salida PDF. Hay tres casos de prueba:
gaussian1
, un estrecho gaussiano simétrico centrado en el origen.gaussian2
, un desplazamiento gaussiano asimétrico más amplio del origen.random
, una condición inicial generada al azar (esto no es de ninguna manera realista, es solo para la visualización).Por ejemplo:
Python test.py gaussian1 freestream.pdf
ejecutará el caso de prueba gaussian1
y guardará resultados en freestream.pdf
. El PDF contiene visualizaciones del estado inicial y todo lo que calcula FreeStreamer
. En cada visualización, los colores rojos indican valores positivos, el azul significa negativo y el valor absoluto máximo de la matriz se anota en la parte superior izquierda.
El script incluido animate.py
genera animaciones (como la que está en la parte superior de esta página) de las condiciones iniciales guardadas en formato HDF5 (por ejemplo, eventos de Trento). Requiere python3 con matplotlib y h5py, y por supuesto, se debe instalar freestream
. Para animar un evento Trento, primero genere algunos eventos en formato HDF5 y luego ejecute el script:
Trento PB PB 10 -O Events.hdf ./animate.py events.hdf event_0 freestream.mp4
El primer argumento es el nombre de archivo HDF5, el segundo es el conjunto de datos para animar, y el último es el nombre de archivo de animación. Ejecutar ./animate.py --help
para obtener más información, incluidas las opciones para la duración de la animación, la velocidad de cuadros, el colormapap, etc.