สตรีมมิ่งฟรีและการจับคู่ Landau สำหรับเงื่อนไขเริ่มต้นของอุทกพลศาสตร์ที่เพิ่มขึ้น
freestream
เป็นการใช้งาน Python ของสตรีมมิ่งฟรี pre-Equilibrium สำหรับการชนของไอออนหนักตามที่อธิบายไว้ใน
เพียงแค่วิ่ง
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
จะต้องมีเงื่อนไขเริ่มต้นสองมิติ (boost-invariant) discretized ลงบนกริดสี่เหลี่ยมเครื่องแบบ จากนั้นจะตีความว่าเป็นโปรไฟล์ความหนาแน่นของ partons ที่ไม่มีมวลชนที่ไม่โต้ตอบในเวลา τ = 0+
พารามิเตอร์ grid_max
ตั้งค่า ขอบ ด้านนอกสุดของกริด ไม่ใช่ จุดกึ่งกลางของเซลล์กริดด้านนอกเช่น
นี่เป็นคำจำกัดความเดียวกับพารามิเตอร์เทรนโต --grid-max
เป็นสิ่งสำคัญมากที่กริดสูงสุดจะถูกตั้งค่าอย่างถูกต้องเพื่อหลีกเลี่ยงการแพร่กระจาย superluminal
สมมติว่า 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
เป็นอาร์เรย์ 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 ()
ความดันจำนวนมากในความเป็นจริงเป็นศูนย์กับ EO ในอุดมคติ แต่จะมีค่าที่ไม่ใช่ศูนย์ขนาดเล็กเนื่องจากความแม่นยำเชิงตัวเลข
หากต้องการใช้ EOS อื่นให้ส่งวัตถุที่เรียกได้ไปยัง bulk_pressure()
:
bulk = fs . bulk_pressure ( eos )
ตัวอย่างเช่นสมมติว่าเรามีตารางความดันและความหนาแน่นพลังงานที่เราต้องการแทรก เราสามารถใช้ scipy.interpolate
เพื่อสร้าง spline และส่งผ่านไปยัง 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
เรียกร้องค่าลบเหล่านี้เป็นศูนย์
test.py
สคริปต์ PY มีการทดสอบหน่วยและสร้างการสร้างภาพข้อมูลสำหรับการตรวจสอบเชิงคุณภาพ ในการเรียกใช้การทดสอบติดตั้งจมูกและเรียกใช้:
nosetests -v test.py
มีการทดสอบสองหน่วย:
การทดสอบเหล่านี้ล้มเหลวเป็นครั้งคราวเนื่องจากมีส่วนประกอบแบบสุ่มและความอดทนค่อนข้างเข้มงวด (ทุกจุดกริดจะต้องเห็นด้วยภายใน 0.1%) เมื่อการทดสอบล้มเหลวมันจะพิมพ์รายการอัตราส่วน (สังเกต/คาดหวัง) โดยทั่วไปแล้วความล้มเหลวจะเกิดขึ้นที่เซลล์กริดนอกสุดซึ่งระบบจะเจือจางมากและแม้จะมีก็จะพลาดเพียง ~ 0.2%เท่านั้น
ในการสร้างการสร้างภาพข้อมูลให้ดำเนินการ test.py
เป็นสคริปต์ที่มีสองอาร์กิวเมนต์กรณีทดสอบเพื่อแสดงภาพและไฟล์เอาต์พุต PDF มีสามกรณีทดสอบ:
gaussian1
, Gaussian แบบสมมาตรแคบที่มีศูนย์กลางอยู่ที่จุดกำเนิดgaussian2
, ออฟเซ็ตแบบไม่สมมาตรแบบไม่สมมาตรจากต้นกำเนิดrandom
เงื่อนไขเริ่มต้นที่สร้างแบบสุ่ม (นี่ไม่ได้เป็นจริง แต่อย่างใดมันเป็นเพียงการสร้างภาพ)ตัวอย่างเช่น:
Python Test.py Gaussian1 freestream.pdf
จะเรียกใช้กรณีทดสอบ gaussian1
และบันทึกผลลัพธ์ใน freestream.pdf
PDF มีการสร้างภาพข้อมูลของสถานะเริ่มต้นและทุกสิ่งที่ FreeStreamer
คำนวณ ในการสร้างภาพแต่ละครั้งสีแดงหมายถึงค่าบวกสีน้ำเงินหมายถึงค่าลบและค่าสัมบูรณ์สูงสุดของอาร์เรย์จะถูกใส่หมายเหตุประกอบในซ้ายบน
สคริปต์ที่รวมอยู่ด้วย animate.py
สร้างภาพเคลื่อนไหว (เช่นเดียวกับที่ด้านบนของหน้านี้) จากเงื่อนไขเริ่มต้นที่บันทึกไว้ในรูปแบบ HDF5 (เช่นเหตุการณ์ Trento) มันต้องใช้ Python3 ด้วย Matplotlib และ H5py และต้องติดตั้ง freestream
แน่นอน ในการเคลื่อนไหวเหตุการณ์ Trento ก่อนอื่นสร้างเหตุการณ์บางอย่างในรูปแบบ HDF5 จากนั้นเรียกใช้สคริปต์:
Trento PB PB 10 -o Events.hdf ./animate.py events.hdf event_0 freestream.mp4
อาร์กิวเมนต์แรกคือชื่อไฟล์ HDF5 ที่สองคือชุดข้อมูลเป็นภาพเคลื่อนไหวและสุดท้ายคือชื่อไฟล์แอนิเมชั่น Run ./animate.py --help
สำหรับข้อมูลเพิ่มเติมรวมถึงตัวเลือกสำหรับระยะเวลาการเคลื่อนไหว, framerate, colormap ฯลฯ