Бесплатная потоковая передача и сопоставление Ландау для инвариантных гидродинамических начальных условий.
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 для получения дополнительной информации, включая варианты продолжительности анимации, кадров, дольма и т. Д.