Streaming livre e correspondência de Landau para condições iniciais hidrodinâmicas invariantes para impulsionar.
freestream é uma implementação do Python de transmissão livre de pré-equilíbrio para colisões de íons pesados, conforme descrito em
Simplesmente correr
pip install freestream
Os únicos requisitos são Numpy (1.8.0 ou posterior) e Scipy (0,14.0 ou posterior).
Problema possível: um UnicodeDecodeError pode ocorrer se a localidade do sistema não estiver definida como uma codificação UTF-8 (devido aos caracteres gregos neste ReadMe e ao Code Docstrings). Para resolver isso, configure a localidade ou simplesmente defina a variável de ambiente LANG , por exemplo, export LANG=en_US.UTF-8 .
freestream possui uma interface orientada a objetos através da classe FreeStreamer , que leva três parâmetros:
freestream . FreeStreamer ( initial , grid_max , time )onde
initial é uma matriz quadrada contendo o estado inicial,grid_max é o X e Y máximo da grade em FM, ou seja, metade da largura da grade (veja o exemplo a seguir),time é a hora de transmitir livre em FM/c. A matriz initial deve conter uma condição inicial bidimensional (invariante) discretizada em uma grade quadrada uniforme. É então interpretado como um perfil de densidade de parte sem missa que não interage no tempo τ = 0+.
O parâmetro grid_max define a borda mais externa da grade, não o ponto médio da célula da grade externa, por exemplo
Esta é a mesma definição que o parâmetro Trento --grid-max .
É muito importante que o MAX da grade esteja definido corretamente para evitar propagação superluminal.
Suponha que initial seja uma matriz de condição inicial n × n com um máximo de grade de 10,0 fm e queremos um fluxo livre por 1,0 fm. Primeiro, criamos um objeto FreeStreamer :
import freestream
fs = freestream . FreeStreamer ( initial , 10.0 , 1.0 ) Agora podemos extrair as várias quantidades necessárias para inicializar a Hydro do fs .
Tuv = fs . Tuv () Tuv é uma matriz n × n × 3 × 3 contendo o tensor completo em cada ponto da grade. Se queremos apenas um determinado componente do tensor, podemos passar índices para a função:
T00 = fs . Tuv ( 0 , 0 ) T00 é uma matriz n × n contendo T 00 em cada ponto da grade. Isto é puramente para conveniência sintática: fs.Tuv(0, 0) é equivalente a fs.Tuv()[:, :, 0, 0] .
e = fs . energy_density () # n x n
u = fs . flow_velocity () # n x n x 3Também podemos extrair os componentes individuais da velocidade de fluxo:
u1 = fs . flow_velocity ( 1 ) # n x n Novamente, isso é equivalente a fs.flow_velocity()[:, :, 1] .
O tensor de pressão de cisalhamento π μν funciona como T μν :
pi = fs . shear_tensor () # n x n x 3 x 3
pi01 = fs . shear_tensor ( 0 , 1 ) # n x nA pressão viscosa a granel π depende da equação do estado p (e) . Por padrão, o EOS ideal P (e) = E /3 é usado:
bulk = fs . bulk_pressure ()A pressão em massa é de fato zero com a EOS ideal, mas haverá pequenos valores diferentes de zero devido à precisão numérica.
Para usar outro EOS, passe um objeto chamável para bulk_pressure() :
bulk = fs . bulk_pressure ( eos ) Por exemplo, suponha que tenhamos uma tabela de pressão e densidade de energia que queremos interpolar. Podemos usar scipy.interpolate para construir um spline e passá -lo para bulk_pressure() :
import scipy . interpolate as interp
eos_spline = interp . InterpolatedUnivariateSpline ( energy_density , pressure )
bulk = fs . bulk_pressure ( eos_spline )O código deve ser executado em alguns segundos, dependendo do tamanho da grade. O tempo de computação é proporcional ao número de células da grade (ou seja , 2 ).
Verifique se a grade é grande o suficiente para acomodar a expansão radial. O código não verifica o excesso.
FreeStreamer retorna referências às suas matrizes internas, portanto, não as modifique no lugar - faça cópias!
FreeStreamer usa um spline cúbico bidimensional (scipy.interpolate.RectBivariatespline) para construir um perfil de condição inicial contínuo a partir de uma grade discreta. Isso é muito preciso, desde que o espaçamento da grade seja pequeno o suficiente. O spline às vezes fica um pouco negativo em torno de limites nítidos; FreeStreamer coescia esses valores negativos a zero.
O script test.py contém testes de unidade e gera visualizações para inspeção qualitativa. Para executar os testes, instale o nariz e execute:
nostests -v test.py
Existem dois testes de unidade:
Esses testes ocasionalmente falham, pois há um componente aleatório e a tolerância é um pouco rigorosa (todo ponto da grade deve concordar em 0,1%). Quando um teste falhar, ele imprimirá uma lista de índices (observados/esperados). Normalmente, as falhas ocorrem na célula da grade mais externa, onde o sistema é muito diluído, e mesmo lá só perderá ~ 0,2%.
Para gerar visualizações, execute test.py como um script com dois argumentos, o caso de teste para visualizar e um arquivo de saída em PDF. Existem três casos de teste:
gaussian1 , um gaussiano simétrico estreito centrado na origem.gaussian2 , um deslocamento gaussiano assimétrico mais amplo da origem.random , uma condição inicial gerada aleatoriamente (isso não é de forma alguma realista, é apenas para visualização).Por exemplo:
python test.py gaussian1 freestream.pdf
Executará o caso de teste gaussian1 e salvará resultados no freestream.pdf . O PDF contém visualizações do estado inicial e tudo o que FreeStreamer calcula. Em cada visualização, as cores vermelhas indicam valores positivos, azul significa negativo e o valor absoluto máximo da matriz é anotado no canto superior esquerdo.
O script incluído animate.py gera animações (como a na parte superior desta página) a partir das condições iniciais salvas no formato HDF5 (por exemplo, eventos Trento). Requer python3 com matplotlib e h5py e, é claro, freestream deve ser instalado. Para animar um evento Trento, primeiro gere alguns eventos no formato HDF5 e depois execute o script:
Trento PB PB 10 -O Events.hdf ./animate.py events.hdf Event_0 freestream.mp4
O primeiro argumento é o nome do arquivo HDF5, o segundo é o conjunto de dados para animar, e o último é o nome do arquivo de animação. Run ./animate.py --help para obter mais informações, incluindo opções para a duração da animação, quadros, colorma, etc.