부스트 불가능한 유체 역학적 초기 조건을위한 자유 스트리밍 및 Landau 매칭.
freestream
단순히 실행됩니다
PIP 설치 프리스트림
유일한 요구 사항은 Numpy (1.8.0 이상) 및 Scipy (0.14.0 이상)입니다.
가능한 문제 : 시스템 로케일이 UTF-8 인코딩으로 설정되지 않으면 (이 readme의 그리스 문자와 코드 문서로 인해) UnicodeDecodeError
가 발생할 수 있습니다. 이를 해결하려면 로케일을 구성하거나 단순히 LANG
환경 변수를 설정하십시오 (예 : export LANG=en_US.UTF-8
.
freestream
에는 FreeStreamer
클래스를 통해 객체 지향 인터페이스가 있으며 세 가지 매개 변수를 사용합니다.
freestream . FreeStreamer ( initial , grid_max , time )
어디
initial
초기 상태를 포함하는 제곱 배열이며grid_max
는 FM의 그리드의 X 및 Y 최대 값, 즉 그리드 너비의 절반 (다음 예 참조),time
FM/C에서 자유 스트림을위한 시간입니다. initial
배열에는 균일 한 사각형 그리드에 개별화 된 2 차원 (부스트 불변) 초기 조건이 포함되어야합니다. 그런 다음 시간 τ = 0+에서 상호 작용하지 않는 질량이없는 파르톤의 밀도 프로파일로 해석됩니다.
grid_max
매개 변수는 외부 그리드 셀의 중간 점이 아닌 그리드의 가장 바깥 쪽 가장자리를 설정합니다.
이것은 Trento --grid-max
매개 변수와 동일한 정의입니다.
초대형 전파를 피하기 위해 그리드 최대가 올바르게 설정되어 있어야합니다.
initial
그리드 최대 10.0 fm 인 n × n 초기 조건 어레이이고 1.0 fm의 자유 스트림을 원한다고 가정 해 봅시다. 먼저 FreeStreamer
개체를 만듭니다.
import freestream
fs = freestream . FreeStreamer ( initial , 10.0 , 1.0 )
이제 fs
에서 Hydro를 초기화하는 데 필요한 다양한 수량을 추출 할 수 있습니다.
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에서는 0이지만 수치 정밀도로 인해 0이 아닌 값이 작습니다.
다른 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
2 차원 입방 스플라인 (scipy.interpolate.rectbivariatespline)을 사용하여 이산 그리드에서 연속 초기 조건 프로파일을 구성합니다. 그리드 간격이 충분히 작다면 이것은 매우 정확합니다. 스플라인은 때때로 날카로운 경계에서 약간 부정적인 경계를 보입니다. FreeStreamer
이러한 음수 값을 0으로 강요합니다.
스크립트 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 이벤트)으로 저장된 초기 조건에서 애니메이션을 생성합니다 (이 페이지 상단의 것과 같은). matplotlib 및 h5py가있는 python3이 필요하며 물론 freestream
설치해야합니다. Trento 이벤트를 애니메이션하기 위해 먼저 일부 이벤트를 HDF5 형식으로 생성 한 다음 스크립트를 실행합니다.
Trento PB PB 10 -o Events.hdf ./animate.py events.hdf event_0 freestream.mp4
첫 번째 인수는 HDF5 파일 이름이고, 두 번째는 애니메이션의 데이터 세트이고, 마지막은 애니메이션 파일 이름입니다. run ./animate.py --help
애니메이션 지속 시간, 프레임 속도, 컬러 맵 등을위한 옵션을 포함한 자세한 정보를 얻으십시오.