สตรีมมิ่งฟรีและการจับคู่ 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 ฯลฯ