自由流媒体和Landau匹配,以促进不变的流体动力初始条件。
freestream
是用于重型离子碰撞的Python实施,如
只需运行
PIP安装自由级
唯一的要求是Numpy(1.8.0或更高版本)和Scipy(0.14.0或更高版本)。
可能的问题:如果未将系统语言环境设置为UTF-8编码(由于此读数和代码DOCSTRINGS中的希腊字符),则可能会发生UnicodeDecodeError
。要解决此问题,请配置语言环境或简单地设置LANG
环境变量,例如export LANG=en_US.UTF-8
。
freestream
通过FreeStreamer
类具有面向对象的接口,该类别采用三个参数:
freestream . FreeStreamer ( initial , grid_max , time )
在哪里
initial
是一个正方形阵列,包含初始状态,grid_max
是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 )
现在,我们可以提取从fs
初始化水电所需的各种数量。
Tuv = fs . Tuv ()
Tuv
是一个N × N ×3×3阵列,每个网格点都包含完整的张量。如果我们只需要张量的某个组件,我们可以将索引传递给该函数:
T00 = fs . Tuv ( 0 , 0 )
T00
是每个网格点上包含T 00的N × N阵列。这纯粹是出于句法便利性: 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.interpaly.trectbivariatespline)从离散网格中构造连续的初始条件曲线。如果网格间距足够小,这是非常精确的。样条有时在尖锐的边界周围略微负面。 FreeStreamer
将这些负值强化为零。
脚本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 Events)生成动画(如本页面上的一个)。它需要使用Matplotlib和H5PY的Python3,当然必须安装freestream
。要为Trento事件进行动画活动,首先以HDF5格式生成一些事件,然后运行脚本:
Trento PB PB 10 -O Events.hdf ./ animate.py Event.hdf Event_0 freestream.mp4
第一个参数是HDF5文件名,第二个是要动画的数据集,最后一个是动画文件名。运行./animate.py --help
以获取更多信息,包括动画持续时间,Framerate,colormap等的选项。