Бесплатная потоковая передача и сопоставление Ландау для инвариантных гидродинамических начальных условий.
freestream
-это реализация Python без равновесного потоковой передачи для столкновений с тяжелыми ионами, как описано в
Просто беги
PIP установить FreeStream
Единственными требованиями являются Numpy (1,8,0 или позже) и Scipy (0,14,0 или позже).
Возможная проблема: может возникнуть UnicodeDecodeError
, если локаль системы не установлена на кодирование UTF-8 (из-за греческих символов в этой Readme и кодексах). Чтобы разрешить это, настройте локали или просто установите переменную среды LANG
, например, export LANG=en_US.UTF-8
.
freestream
имеет объектно-ориентированный интерфейс через класс FreeStreamer
, который берет три параметра:
freestream . FreeStreamer ( initial , grid_max , time )
где
initial
является квадратный массив, содержащий начальное состояние,grid_max
- это максимум x и y сетки в FM, то есть половина ширины сетки (см. Пример),time
- это время свободного потока в FM/C. initial
массив должен содержать двумерное (усиление-инвариантное) начальное условие, дискретизированное на равномерную квадратную сетку. Затем он интерпретируется как профиль плотности не вмешательства безумных партонов в момент времени τ = 0+.
Параметр grid_max
устанавливает самый внешний край сети, а не среднюю точку ячейки внешней сетки, например,
Это то же определение, что и параметр Trento --grid-max
.
Очень важно, чтобы макс сетки устанавливался правильно, чтобы избежать суперсвязанного распространения.
Предположим, что initial
является массив исходного условия N × N с максимумом сетки 10,0 FM, и мы хотим освободить поток для 1,0 FM. Сначала мы создаем объект FreeStreamer
:
import freestream
fs = freestream . FreeStreamer ( initial , 10.0 , 1.0 )
Теперь мы можем извлечь различные величины, необходимые для инициализации Hydro из fs
.
Tuv = fs . Tuv ()
Tuv
представляет собой массив N × N × 3 × 3, содержащий полный тензор в каждой точке сетки. Если мы хотим только определенный компонент тензора, мы можем передать индексы функции:
T00 = fs . Tuv ( 0 , 0 )
T00
- это массив N × N , содержащий T 00 в каждой точке сетки. Это исключительно для синтаксического удобства: fs.Tuv(0, 0)
эквивалентно fs.Tuv()[:, :, 0, 0]
.
e = fs . energy_density () # n x n
u = fs . flow_velocity () # n x n x 3
Мы также можем извлечь отдельные компоненты скорости потока:
u1 = fs . flow_velocity ( 1 ) # n x n
Опять же, это эквивалентно fs.flow_velocity()[:, :, 1]
.
Тензор давления сдвига π μν работает так же, как t μν :
pi = fs . shear_tensor () # n x n x 3 x 3
pi01 = fs . shear_tensor ( 0 , 1 ) # n x n
Огромное вязкое давление π зависит от уравнения состояния p (e) . По умолчанию используется идеальный EOS P (E) = E /3:
bulk = fs . bulk_pressure ()
Основное давление на самом деле нулевое с идеальными EOS, но будут небольшие ненулевые значения из -за численной точности.
Чтобы использовать другой EOS, передайте вызываемый объект в bulk_pressure()
:
bulk = fs . bulk_pressure ( eos )
Например, предположим, что у нас есть таблица давления и плотности энергии, которую мы хотим интерполировать. Мы можем использовать scipy.interpolate
для построения сплайна и передать его в bulk_pressure()
:
import scipy . interpolate as interp
eos_spline = interp . InterpolatedUnivariateSpline ( energy_density , pressure )
bulk = fs . bulk_pressure ( eos_spline )
Код должен работать через несколько секунд, в зависимости от размера сетки. Время вычисления пропорционально количеству ячеек сетки (т.е. n 2 ).
Убедитесь, что сетка достаточно большая, чтобы приспособить радиальное расширение. Код не проверяется на переполнение.
FreeStreamer
возвращает ссылки на свои внутренние массивы, поэтому не изменяйте их на месте - сделайте копии!
FreeStreamer
использует двумерный кубический сплайн (scipy.interpolate.rectbivariatespline) для построения непрерывного профиля начального условия из дискретной сетки. Это очень точное при условии, что расстояние между сети достаточно мало. Сплайн иногда становится очень слегка отрицательным вокруг острых границ; FreeStreamer
приводит эти отрицательные значения до нуля.
Script test.py
содержит модульные тесты и генерирует визуализации для качественной проверки. Чтобы запустить тесты, установить нос и запустить:
nosetests -v test.py
Есть два модульных теста:
Эти тесты иногда терпят неудачу, так как существует случайный компонент, а допуск несколько строгой (каждая точка сетки должна согласоваться в пределах 0,1%). Когда тест не пройдет, он распечатает список соотношений (наблюдается/ожидается). Как правило, сбои происходят в самой внешней сетке, где система очень разбавлена, и даже там она будет пропустить только на 0,2%.
Чтобы сгенерировать визуализации, выполните test.py
как сценарий с двумя аргументами, тестовый пример для визуализации и выходной файл PDF. Есть три тестовых случая:
gaussian1
, узкий симметричный гауссовый, центрированный на начале.gaussian2
, более широкое асимметричное смещение гауссов от происхождения.random
, случайно сгенерированное начальное условие (это никоим образом не является реалистичным, оно только для визуализации).Например:
python test.py gaussian1 freestream.pdf
Запустит тестовый пример gaussian1
и сохранит результаты в freestream.pdf
. PDF содержит визуализации начального состояния и всего, что вычисляет FreeStreamer
. В каждой визуализации красные цвета указывают на положительные значения, синий означает отрицательный, а максимальное абсолютное значение массива аннотируется в левом верхнем углу.
Включенный сценарий animate.py
генерирует анимацию (например, в верхней части этой страницы) из начальных условий, сохраненных в формате HDF5 (например, события Trento). Это требует Python3 с Matplotlib и H5Py, и, конечно, freestream
должен быть установлен. Чтобы оживить событие Тренто, сначала сгенерируйте некоторые события в формате HDF5, а затем запустите сценарий:
Trento Pb Pb 10 -o Events.hdf ./animate.py Events.hdf Event_0 FreeStream.mp4
Первым аргументом является имя файла HDF5, второе - это набор данных, чтобы оживить, а последнее - имя файла анимации. Запустить ./animate.py --help
для получения дополнительной информации, включая варианты продолжительности анимации, кадров, дольма и т. Д.