เทคนิคจำลองของไหล ไฟ และควันแบบเรียลไทม์
(andrewkchan.dev)- การจำลองไฟแบบเรียลไทม์บน GPU สามารถทำเป็นเดโม WebGL ได้โดยผสาน กลศาสตร์ของไหล การคำนวณขนานบนกริด และโมเดลการเผาไหม้·แรงลอยตัว·การเรนเดอร์
- โมเดลพื้นฐานสมมติให้เป็นการไหลแบบไม่อัดตัวและไม่มีความหนืด และใช้ semi-Lagrangian advection เพื่อพาสนามสเกลาร์ เช่น สีย้อม อุณหภูมิ และเชื้อเพลิง ไปตามสนามความเร็ว ทำให้ได้เสถียรภาพและความขนาน
- ในขั้นตอน Navier-Stokes จะพาสนามความเร็วด้วยตัวมันเองก่อน แล้วลด divergence ด้วย pressure projection และจัดการสมการ Poisson ด้วยวิธีเฉลยเชิงประมาณที่เป็นมิตรกับ GPU เช่น การวนซ้ำ Jacobi
- การอินเตอร์โพเลตบนกริดและวิธี semi-Lagrangian อันดับหนึ่งทำให้วังวนปั่นป่วนอ่อนลง จึงเสริมรายละเอียดการหมุนขนาดเล็กด้วย vorticity confinement และ curl noise
- ไฟเพิ่มความหนาแน่นเชื้อเพลิงและสนามอุณหภูมิเพื่อคำนวณการเผาไหม้ การเย็นตัว และแรงลอยตัวจากความร้อน แล้วเรนเดอร์ด้วยสีรังสีวัตถุดำตาม Planck’s Law เพื่อให้ของไหลลักษณะควันดูเหมือนเปลวไฟ
ภาพรวมการจำลองไฟด้วย GPU
- ไฟเป็นโจทย์ที่น่าสนใจในงานกราฟิก แต่ในอดีตมักถูกเลียนแบบด้วยวิธีที่ไม่ได้อิงฟิสิกส์
- Lord of the Rings ใช้สไปรต์ควันจำนวนมากเพราะต้นทุนการจำลองของไหลสูง
- แอปพลิเคชันแบบเรียลไทม์อย่างวิดีโอเกมก็พึ่งพาแนวทางที่แทบไม่อิงฟิสิกส์เกือบทั้งหมด
- ในช่วง 10 ปีที่ผ่านมา GPU ทำให้การทำ fluid simulation ที่รวดเร็วทำได้ง่ายขึ้น และอัลกอริทึมกลศาสตร์ของไหลพื้นฐานก็นำไปใช้บน GPU ได้ค่อนข้างตรงไปตรงมา
- ILM ใช้เทคนิคเหล่านี้ในปี 2009 สำหรับการสร้างโมเดลและเรนเดอร์ไฟใน Harry Potter
- NVIDIA เปิดตัว FlameWorks ในปี 2014 ซึ่งเป็นระบบเอฟเฟกต์ไฟและควันสำหรับเกม
- การใช้งานจริงประกอบเป็นเดโม WebGL และในเชิงคณิตศาสตร์ต้องมีพื้นฐานแคลคูลัสเวกเตอร์และสมการเชิงอนุพันธ์
- ซอร์สโค้ดอยู่บน GitHub
เริ่มจากการสร้างโมเดลของไหล
- ก่อนสร้างไฟต้องจำลองของไหลก่อน โดยที่นี่สมมติให้ของไหล ไม่อัดตัว (incompressible) และ ไม่มีความหนืด (inviscid)
- สนามความเร็ว 2D
u(x, t)แทนด้วยกริดN × Nและแต่ละจุดกริดมีค่าความเร็ว ณ ตำแหน่งนั้น - กระบวนการที่สนามสเกลาร์
ψ(x, t)เช่น ความหนาแน่นของสีย้อม เคลื่อนที่ตามความเร็วของของไหล เรียกว่า advection - วิธีที่เพียงแค่เคลื่อนแต่ละจุดกริดไปข้างหน้าทำให้ทำขนานได้ยาก จุดกริดหลายจุดอาจเคลื่อนไปยังจุดกริดปลายทางเดียวกัน และเมื่อช่วงเวลามากขึ้นก็อาจไม่เสถียรได้
การพาที่เสถียร: วิธี semi-Lagrangian
- เมื่อใช้กฎอนุรักษ์มวลและทฤษฎีบท divergence สมการการพาสเกลาร์ของการไหลแบบไม่อัดตัวจะจัดรูปได้เป็น
∂ψ/∂t = -u · ∇ψ - วิธีที่เสถียรคือ แทนที่จะส่งแต่ละจุดกริดไปข้างหน้าตามความเร็ว ให้ ย้อนรอยกลับ จากจุดกริดปัจจุบันไปตามทิศทางความเร็ว แล้วดึงค่าจากตำแหน่งก่อนหน้ามาใช้
- วิธีนี้คือ Semi-Lagrangian advection ซึ่ง Jos Stam สร้างขึ้นในปี 1999
- แต่ละจุดกริดถูกอัปเดตเพียงครั้งเดียวต่อรอบ จึงทำขนานบน GPU ได้ง่าย
- ไม่มีจุดกริดใดถูกอัปเดตเป็นค่าที่มากกว่าค่าสูงสุดของจุดกริดเดิม จึงเสถียรแบบไม่มีเงื่อนไข
- หากสนามความเร็วคงที่เป็นไปตามเงื่อนไขไม่อัดตัว ก็สามารถพาสนามสเกลาร์อย่างสีย้อมได้อย่างเสถียร
อัปเดตสนามความเร็วด้วย Navier-Stokes
- Navier-Stokes equations กำหนดว่าสนามความเร็วของของไหลเปลี่ยนไปตามเวลาอย่างไรในการไหลแบบไม่อัดตัว
- เมื่อสมมติให้เป็นของไหลไม่มีความหนืดโดยตัดพจน์ความหนืดออก และละเลยแรงภายนอกไปก่อน จะเหลือพจน์หลักสองส่วน
- self-advection ที่สนามความเร็วพาตัวมันเอง
- pressure เพื่อทำให้เป็นไปตามเงื่อนไขไม่อัดตัว
- ลูปการจำลองดำเนินโดยคร่าว ๆ ตามลำดับนี้
- พาสนามความเร็ว
uด้วยตัวมันเอง - คำนวณความดัน
p - ลบเกรเดียนต์ของความดันด้วย
u = u - gradient(p)เพื่อบังคับให้ไม่อัดตัว - พาสนามความหนาแน่นด้วยสนามความเร็วใหม่
- พาสนามความเร็ว
การคำนวณความดันมีคอขวดอยู่ที่สมการ Poisson
- ไม่สามารถรับประกันได้ว่าสนามความเร็วตัวเลือก
u'ที่ได้หลัง self-advection จะมี divergence เป็น 0 จึงต้องใช้ความดันมาแก้ไข - เมื่อจัดรูปเงื่อนไขจะได้ Poisson equation ในรูป
∇²p = ∇ · u' - เมื่อดิสครีไทซ์ divergence และ Laplacian บนกริด จะเกิดระบบเชิงเส้นที่มีสมการเชิงเส้น
N²สมการและตัวไม่ทราบค่าN²ตัว สำหรับกริดN × N - วิธีแก้ระบบเชิงเส้นแบบแม่นยำมีต้นทุนเพิ่มขึ้นแบบมากกว่าเชิงเส้นตามขนาดกริด จึงเป็นภาระสำหรับการจำลองแบบเรียลไทม์
- บน GPU สามารถหาค่าประมาณที่ดีพอแบบวนซ้ำแทนคำตอบที่แม่นยำได้
- Jacobi method เหมาะกับการใช้งานบน GPU เพราะอัปเดตค่าประมาณของแต่ละองค์ประกอบแบบขนาน
- วิธีที่ลู่เข้าเร็วกว่า เช่น Conjugate Gradient และ Multigrid ก็สามารถนำไปใช้บน GPU ได้
- สำหรับควันและไฟ การเปลี่ยนแปลงปริมาตรไม่ได้เด่นชัดเหมือนน้ำ คุณภาพของ advection หรือความง่ายในการใช้งานจึงอาจสำคัญกว่าความแม่นยำของความดัน
คืนรายละเอียดของวังวน
- เมื่อเก็บสนามความเร็วบนกริด จะเกิดการทำให้เรียบเชิงตัวเลขที่ไม่ต้องการระหว่างการอินเตอร์โพเลต
- เมื่อรวมกับการประมาณหยาบของ semi-Lagrangian advection อันดับหนึ่ง วังวนปั่นป่วนจะหายไป และของไหลจะดูเรียบและจำเจเกินไป
- การเพิ่มความละเอียดช่วยบรรเทาได้ แต่ในการจำลองแบบเรียลไทม์ ทรัพยากรคำนวณมีจำกัด
- Vorticity confinement เป็นวิธีค้นหาและขยายรายละเอียดขนาดเล็กที่หายไประหว่างแต่ละสเต็ป
- ไม่ใช่วิธีที่สมจริงทั้งหมด แต่โดยทั่วไปช่วยรักษารายละเอียดสเกลเล็กไว้ในตำแหน่งที่สอดคล้องทางฟิสิกส์
- เดิมทีถูกคิดขึ้นเพื่อใช้ในการจำลองเชิงวิศวกรรมสำหรับจัดการสนามการไหลที่ซับซ้อนรอบใบพัดเฮลิคอปเตอร์
- วัด vorticity ด้วย curl ของแต่ละจุดกริด คำนวณทิศทางที่ vorticity สูงในบริเวณรอบ ๆ แล้วเพิ่มแรงหมุนที่ปรับด้วยค่าคงที่ confinement
ε > 0เข้าไปในสนามความเร็ว- แม้ใช้ค่า confinement ต่ำราว
0–15ก็สร้างความแตกต่างได้มาก - ค่าที่สูงขึ้นสามารถสร้างการไหลแบบ billowing ที่มีสไตล์ได้
- แม้ใช้ค่า confinement ต่ำราว
สังเคราะห์ความปั่นป่วนด้วย Curl noise
- Curl noise ไม่ได้วัดและขยาย vorticity ของสนามความเร็วเดิม แต่สร้างสนาม vorticity แบบสเกลาร์ขึ้นใหม่ด้วยฟังก์ชัน noise
- ในเชิงคณิตศาสตร์ จะสังเคราะห์สนาม vorticity สุ่ม
φ = rand * zแล้วบวกเข้ากับ vorticity เดิมωเพื่อสร้าง vorticity สุดท้ายω* = ω + φ - ของไหลที่เคลื่อนที่เร็วและปั่นป่วนสูงอย่างควันและไฟได้รับผลจาก vorticity confinement และ curl noise อย่างมาก
- สนาม curl noise จริง
φเปลี่ยนแปลงตามเวลาและถูกพาไปพร้อมกับการไหลของของไหล
เพิ่มเชื้อเพลิงและอุณหภูมิสำหรับไฟ
- รูทีนของไหลพื้นฐานเพียงอย่างเดียวสร้างการไหลคล้ายควันได้ และถ้าต้องจำลองไฟกับควันก็ต้องมีช่องข้อมูลเพิ่มอีกบางส่วน
- โมเดลการเผาไหม้เพิ่ม ความหนาแน่นเชื้อเพลิง
ρและ สนามอุณหภูมิT0 ≤ ρ ≤ 1คือความหนาแน่นเชื้อเพลิงT > 0คืออุณหภูมิของแต่ละตำแหน่ง
- ในที่นี้สมมติว่าเชื้อเพลิงในระบบถูกจุดติดแล้วและเพิ่มความร้อนอย่างต่อเนื่อง โดยไม่จัดการปัญหาเชื้อเพลิงที่ยังไม่ติดไฟ
- ในแต่ละ timestep เชื้อเพลิงจะเพิ่มอุณหภูมิตามอุณหภูมิการเผาไหม้ที่กำหนด
- อุณหภูมิถูกอัปเดตในรูป
T' = max(T, ρ * T_burn)
- อุณหภูมิถูกอัปเดตในรูป
- ความร้อนแพร่จากบริเวณร้อนไปยังบริเวณเย็น และการไหลขนาดใหญ่ของของไหลก็พาความร้อนไปด้วย
- ในการจำลอง จะพาสนามอุณหภูมิด้วยสนามความเร็ว
- โมเลกุลที่ทำปฏิกิริยาก็เคลื่อนที่ไปพร้อมกับของไหล ดังนั้นสนามเชื้อเพลิงจึงถูกพาไปด้วย
- โมเลกุลร้อนปล่อยอุณหภูมิออกมาเป็นแสงตาม Stefan-Boltzmann Law
- หากเป็นการจำลองที่แม่นยำทางฟิสิกส์ จะใช้ค่าคงที่ Stefan-Boltzmann
- ในการจำลองกราฟิก การให้อาร์ทิสต์ปรับอัตราการเย็นตัว
σ_coolได้มักมีประโยชน์กว่า
- เชื้อเพลิงลดลงตามอัตราการเผาไหม้
γ_fuelในทุก timestep
ยกของไหลร้อนขึ้นด้วยแรงลอยตัวจากความร้อน
- หากคำนวณเพียงสนามอุณหภูมิ จะยังไม่มีผลต่อการไหลของของไหล จึงต้องเพิ่มเอฟเฟกต์ที่ทำให้อากาศร้อนลอยขึ้นและอากาศเย็นเคลื่อนลง
- Thermal buoyancy เพิ่มแรงทิศขึ้นที่แปรผันตามอุณหภูมิเข้าไปในสนามความเร็ว
- เนื่องจากสมมติให้เป็นการไหลแบบไม่อัดตัว จึงไม่จัดการการขยายตัวจริงของอากาศ
- สนามความเร็วถูกอัปเดตในรูป
u' = u + (β T Δt) j βคือค่าคงที่แรงลอยตัวบวก และjคือเวกเตอร์หน่วยทิศขึ้น
- เมื่อเพิ่มโมเดลการเผาไหม้และแรงลอยตัวจากความร้อน จะสร้างของไหลที่ดูเหมือนไฟได้
- หากเลือกค่าแรงลอยตัวและการเย็นตัวอย่างเหมาะสม จะได้ลำวัสดุขนาดใหญ่ที่พองตัวขึ้น
- ผลลัพธ์ในขั้นนี้ใกล้เคียงควันมากกว่าเปลวไฟที่แม่นยำ
- ลูปทั้งหมดประกอบด้วย self-advection ของความเร็ว, การเผาไหม้, vorticity confinement, แรงลอยตัวจากความร้อน, pressure projection และ advection ของความหนาแน่น·อุณหภูมิ·เชื้อเพลิง ตามลำดับ
เรนเดอร์สีเปลวไฟด้วยรังสีวัตถุดำ
- ไฟเป็น participating medium และปล่อยแสงผ่านรังสีวัตถุดำ
- สีส้มและสีแดงของไฟมาจากรังสีวัตถุดำ และหากเรนเดอร์การจำลองเชื้อเพลิงที่กำลังเผาไหม้ด้วยสูตรที่ถูกต้อง ก็สามารถเปลี่ยนจากควันไปเป็นไฟได้
- Planck’s Law อธิบายความหนาแน่นสเปกตรัมของแสงที่วัตถุดำที่อุณหภูมิ
Tปล่อยออกมา - เมื่อใช้งานการเรนเดอร์วัตถุดำด้วย fragment shader ก็สามารถสร้างการจำลองไฟที่สมบูรณ์บนโมเดลของไหล·การเผาไหม้·แรงลอยตัวได้
- ยังมีหัวข้อขยายที่ไม่ได้กล่าวถึงเหลืออยู่
- เทคนิคแบบไม่อิงกริดสำหรับแก้การจำลองในปริมาตรคงที่
- ปัญหาโดเมนแปรผันที่ของไหลครอบครองพื้นที่ต่างกันภายในกริด เช่น น้ำในแก้วที่เต็มครึ่งหนึ่ง
- สิ่งกีดขวางแบบไดนามิก
- วิธีปรับปรุงการเรนเดอร์ เช่น รังสีวัตถุดำที่แม่นยำขึ้น การกระเจิงของแสง และเอฟเฟกต์หลังการประมวลผล
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมจบ ปริญญาเอกด้าน CFD มา แต่เพิ่งเคยเห็นเทคนิค vorticity confinement และ curl-noise turbulence เป็นครั้งแรก
ในย่านที่มี Reynolds number สูงกว่าอย่าง CFD สำหรับอุตสาหกรรม โดยทั่วไปเราไม่ค่อยต้องการแนวทางที่ชดเชยการสลายตัวเทียมของวิธีเชิงตัวเลขด้วย noise
ตรงกันข้าม หลายครั้งเราต้องการการสลายตัวเทียมเพื่อทำให้การจำลองที่ Reynolds number สูงมีเสถียรภาพ และในคอมพิวเตอร์กราฟิกส์ดูเหมือนว่า สิ่งที่ดูสมจริงน่าเชื่อ จะสำคัญกว่าสิ่งที่ถูกต้องตามฟิสิกส์
ถึงขั้นไม่จำเป็นต้องดูถูกต้องด้วยซ้ำ แค่ ดูเท่ ก็พอ
ในฐานะคนคลั่งฟิสิกส์ ผมเคยชี้ฉากที่ละเมิดกฎฟิสิกส์ในตู้เกม แล้วคนก็หัวเราะกัน
บทสัมภาษณ์แปลของนักฟิสิกส์ที่ทำงานกับ Mario World ที่ Nintendo น่าสนใจมาก เขาเน้นว่าฟิสิกส์ในโลกของ Mario แม้จะไม่เหมือนฟิสิกส์ “โลกจริง” แต่ก็มีกฎที่ สอดคล้องกัน เหมือนฟิสิกส์จริง และสิ่งนั้นสำคัญต่อการที่ผู้เล่นจะเข้าใจว่าทำอะไรได้ในเกมและแก้ปริศนาได้
ผมใช้ไอเดียพื้นฐานจากเปเปอร์นั้นทำโปรแกรมที่ค่อนข้างดีสำหรับสร้างเท็กซ์เจอร์ดาวเคราะห์ก๊าซ: https://github.com/smcameron/gaseous-giganticus
มีคนถามผมมากกว่าหนึ่งครั้งว่า “ทำไม Unreal Engine ทำได้ในไม่กี่วินาที แต่ ซอฟต์แวร์ CFD ของคุณใช้เวลาหลายชั่วโมงต่อการจำลองหนึ่งครั้ง”
https://en.wikipedia.org/wiki/John_Steinhoff
https://en.wikipedia.org/wiki/Vorticity_confinement
มีเปเปอร์ที่เกี่ยวข้องด้วย:
https://www.researchgate.net/publication/239547604_Modificat...
https://www.researchgate.net/publication/265066926_Computati...
เมื่อก่อนผมเคยอ่านบทความที่ไหนสักแห่ง แล้วทำ การจำลองเปลวไฟ แบบของเล่นที่ง่ายมากด้วย C
แค่ตั้งค่าความสว่างของแต่ละพิกเซลให้เป็นค่าเฉลี่ยความสว่างของพิกเซลที่อยู่ติดกัน แล้วคำนวณจากล่างขึ้นบนก็พอ
ถ้าเพิ่มพิกเซล “ร้อน” สองสามจุดที่ขยับซ้ายขวาไว้ด้านล่าง ก็จะได้เปลวไฟทันที ใช้โค้ดน้อยมาก และดูดีพอสมควรโดยไม่ต้องใช้แคลคูลัส
ในหนึ่งมิติมันก็แค่อนุพันธ์อันดับสอง หรือก็คือความโค้ง ยิ่งยอดแหลมก็ยิ่งเป็นลบมาก ยิ่งแอ่งแหลมก็ยิ่งเป็นบวกมาก
ถ้าเปลี่ยนค่าตามนั้นก็จะเกิดผลแบบการเฉลี่ย และรูปแบบที่ถูกทำให้เป็นดิสครีตก็คือการหาค่าเฉลี่ยตรงตัว
จริง ๆ แล้วคุณกำลังทำแคลคูลัสอยู่ตลอด
การรู้ทางกับการเดินไปตามทางนั้นเป็นคนละเรื่องกัน
มีวิดีโอของ 3Blue1Brown ที่อธิบายด้วยกราฟิกแบบเข้าใจง่ายด้วย: https://youtube.com/watch?v=ToIXSwZ1pJU
พูดถึงการจำลองไฟและควันสำหรับเกม รวมถึงการจำลองของไหลบน GPU แล้วผมสงสัยว่าถ้าเอฟเฟกต์แบบนี้รันอยู่ในเกม GPU ก็ยุ่งอยู่แล้วไม่ใช่หรือ
การรันปัญหา CFD ไปพร้อมกับเรนเดอร์ดูเป็นภาระที่ค่อนข้างหนัก
ผมสงสัยว่าจะรันสิ่งนี้บน iGPU ระหว่างที่ dGPU ทำงานเกี่ยวกับการเรนเดอร์ได้ไหม หรือ iGPU อ่อนเกินไปจนย้ายไป CPU ยังดีกว่า
GPU สมัยนี้ทรงพลังมากพอที่จะจัดการฟิสิกส์, render pass หรู ๆ, การจำลองของไหล, การหาเส้นทางของยูนิตสำหรับ “AI ในเกม” ฯลฯ ได้ที่ มากกว่า 100FPS
ถ้าตอบยาว เวลาระหว่างการเรนเดอร์เฟรม “สไลด์โชว์” ที่เร็วมากระดับ 60FPS ขึ้นไปคือ frame budget และโดยทั่วไปต้องคำนวณสถานะของเฟรมถัดไปกับงานที่จำเป็นต่อการเรนเดอร์ให้เสร็จภายใน 5–30ms
ภายในนั้นอาจมีการเคลื่อนที่ของยูนิตบนแผนที่, การคำนวณฟิสิกส์ของเปลวไฟ, การคัดลอกเท็กซ์เจอร์ภูมิประเทศ, การเรนเดอร์เวอร์เท็กซ์ที่มี material เป็นต้น และในเอนจินเกมจำนวนมาก GPU จะทำการคำนวณแยกแบบนี้เป็นสิบ ๆ งานในแต่ละเฟรม
โดยพื้นฐานแล้ว GPU เป็นคอมพิวเตอร์เสริมที่ต่ออยู่กับคอมพิวเตอร์หลัก ทุกเฟรมเราส่งงานหลายอย่างไปให้ มันคืนผลลัพธ์มา แล้วเอาผลลัพธ์เหล่านั้นมารวมกันให้ดูเหมือนเกม
แทบไม่มีใครใช้ iGPU
โดยปกติเมื่อเทียบกับ dGPU หลักแล้วมันแทบไร้ประโยชน์ จึงมักถูกเมิน
ยุคของการหาสมดุลตรงนั้นน่าจะน่าสนุก และดูเหมือนว่า ทรัพยากรคอมพิวต์ทั้งแบบโลคัลและระยะไกล จะค่อย ๆ แบ่งภาระกันมากขึ้น
ผมจำได้ว่าตั้งค่าหรือสังเกตเห็นการตั้งค่านั้นตอนดูผนังที่พังต่อเนื่องใน Red Faction
แทบจะเหมือน Minecraft แต่เป็นเวอร์ชันถือ rocket launcher อยู่บนดาวอังคาร
ถ้าจะใช้ GPU ก็ไม่จำเป็นต้องกำลังเล่นเกมอยู่เสมอไป
ทุกวันนี้มีซอฟต์แวร์เรนเดอร์จำนวนมากที่มีโหมด GPU ด้วย
แต่เนื่องจากอัลกอริทึมบน GPU ถูกทำให้ขนานกันอย่างสูง จึงมักแตกต่างจากอัลกอริทึมซิมูเลชันบน CPU
EmberGen เป็นซอฟต์แวร์ที่บ้าพลังจริง ๆ ซึ่งจำลองไฟและควันแบบเรียลไทม์บน GPU สำหรับผู้บริโภคทั่วไป และยังรองรับเวิร์กโฟลว์แบบ node-based ทำให้สร้างเอฟเฟกต์ใหม่ ๆ ได้ง่าย
เวิร์กโฟลว์ที่เดิมใช้เวลาหลายชั่วโมง ตอนนี้ปรับให้ลงตัวได้ในไม่กี่นาที
https://jangafx.com/software/embergen/
ผมนึกว่าบทความนี้จะเกี่ยวกับ EmberGen และพูดตรง ๆ ก็เสียดายนิดหน่อยที่ EmberGen ไม่ได้รับความสนใจมากนักบน HN: https://hn.algolia.com/?dateRange=all&page=0&prefix=true&que...
ผมไม่ได้เกี่ยวข้องกับ EmberGen/JangaFX เป็นแค่ลูกค้าที่พอใจเท่านั้น
https://odin-lang.org/showcase/embergen/
ถ้าชอบเรื่องแบบนี้ Ten Minute Physics ก็น่าจะสนุก
โดยเฉพาะบทที่ 17 “How to write an Eulerian Fluid Simulator with 200 lines of code” ดีมาก
https://matthias-research.github.io/pages/tenMinutePhysics/i...
อยากรู้ว่ามีแหล่งข้อมูลแนะนำอะไรดีสำหรับคนที่เรียนคณิตศาสตร์มาแล้วผันตัวเป็นวิศวกรซอฟต์แวร์ และอยากเริ่มต้นกับ CFD simulation
หัวข้อนี้น่าสนใจมากจริง ๆ แต่ไม่ได้แตะ vector calculus หรือ partial differential equations มานานแล้ว คณิตศาสตร์เลยขึ้นสนิมไปเยอะ
https://www.youtube.com/watch?v=zxiqA8_CiC4
เวอร์ชัน “Apprentice” ฟรีสำหรับใช้งานไม่เชิงพาณิชย์ จำกัดแค่การเรนเดอร์และฟีเจอร์การทำงานร่วมกัน
แต่เป็นเครื่องมือที่ลึกพอสมควร
ถ้าย้ายจากสายซอฟต์แวร์เข้ามาในวงการนี้ เวิร์กโฟลว์ในการเรียนรู้เครื่องมือแบบนี้จะแตกต่างไปโดยสิ้นเชิง
หลายคนบอกว่า Houdini คล้าย IDE มากกว่าโปรแกรมทำโมเดล 3D ซึ่งผมเห็นด้วยในหลายแง่
แทนที่จะใช้เครื่องมือแบบภาพอย่าง Blender แทบทั้งหมดคือการสร้างเครือข่ายโหนด แล้วปรับ attribute กับ parameter
ส่วนใหญ่ทำด้วย Python ได้ และสะอาดกว่าอย่าง 3ds Max แต่เพราะไม่ได้คอมไพล์ ประสิทธิภาพจึงแย่ในซิมูเลชันขนาดใหญ่
ภาษาตระกูล C ของตัวเองอย่าง VEX ก็ใช้งานได้ดี และยังมีระบบโหนดที่ละเอียดกว่าไว้สำหรับงานจุกจิกอย่างคณิตศาสตร์ที่ซับซ้อนขึ้น
ในเชิงเทคนิคแล้ว แทบทั้งหมดเป็น เวิร์กโฟลว์แบบ data-oriented
แต่ถ้าคุณเป็นสาย “เรียนด้วยการอ่านเอกสาร” ก็คงต้องรีบหัดรัก tutorial ให้ได้
มันแตกต่างจาก environment หรือ paradigm ใด ๆ ที่ผมเคยแตะมาก และชุมชนโดยรวมก็เป็นมิตร แต่มี curse of knowledge ค่อนข้างหนัก
ถ้าอยากทำจริง ๆ แนะนำให้หางานในสายนี้ และลองสมัครฝั่ง Federal หรือ Contractor ที่ Marshall Space Flight Center หรือ Ames
ที่ Ames มีระบบ Aitken [#85, 9.07 PFlops], Pleiades [#132, 5.95 PFlops], Electra [#143, 5.44 PFlops] ตามอันดับ Top500
ที่ GRC, LARC, JSC ก็มีอยู่บ้าง
อย่างน้อยเมื่อหลายปีก่อน การผสานงานระหว่าง Contractor/Federal ทำได้ค่อนข้างดี และแทบโปร่งใส ยกเว้นเรื่องการจัดสรรเงิน
ภายใน NASA กลุ่ม Propulsion Structural, Thermal & Fluid Analysis [2][3] ของ MSFC และกลุ่ม Entry Systems [4] ของ Ames ค่อนข้างเป็นที่รู้จัก
ตอนนั้นเราใช้ Overflow/LARC [5] หรือ Loci/Mississippi State University [6] รัน Hybrid RANS/LES simulation ขนาดประมาณ 100 ล้านเซลล์ ของยานพาหนะหรือยานพาหนะ+แท่นปล่อย ซึ่งรวม moving overset grids, reactive combustion species ราว 10–20 ชนิด และพลวัตอนุภาคระเหยแบบ Lagrangian
มีทั้งการจุดระเบิด SSME และ SRB พร้อมกัน และรวมระบบ water suppression ตอนปล่อยด้วย
แต่ข้อมูลนี้มาจากเมื่อ 10 ปีก่อน เลยไม่รู้ว่าระดับล่าสุดตอนนี้เป็นอย่างไร และตอนนี้น่าจะก้าวหน้าไปกว่านี้แล้ว
ถ้าอยากรู้ทิศทางที่วงการสนใจ แม้จะเก่าแล้ว แต่ CFD Vision 2030 Study ปี 2014 ก็เป็นเอกสารเริ่มต้นที่ไม่เลว [7]
การหาบัตรไปงาน Supercomputing แล้วเดินดูรอบ ๆ ก็ดีเหมือนกัน
ปีนี้จัดที่ Denver [8]
แต่โฟกัสจะไปทาง “ขนาดใหญ่” จึงมักได้เห็นซิมูเลชันสภาพอากาศขนาดมหึมาหรือพลวัตของเนบิวลาเป็นหลัก
ตัวคอนเฟอเรนซ์เองดีนะ แต่ถ้าไม่มีผลงานเชิงสเกลระดับ #CPUs/#GPUs/#FPGAs++ ก็ยากที่จะเป็นที่สนใจ
ฝั่งรัฐบาลนอก NASA ก็มี NIST(Gaithersburg), DOE(Oak Ridge, Sandia, Los Alamos), Air Force(AF Research Lab), Huntington Beach
[1] NASA Advanced Supercomputing Division: https://en.wikipedia.org/wiki/NASA_Advanced_Supercomputing_D...
[2] NASA, MSFC: https://www.nasa.gov/wp-content/uploads/2016/01/g-28367g_pst...
[3] ตัวอย่างที่ค่อนข้างเก่า: https://ntrs.nasa.gov/api/citations/20140016892/downloads/20...
[4] NASA Ames: https://www.nasa.gov/entry-systems-and-technology-division/
[5] OVERFLOW/NASA/LARC: https://overflow.larc.nasa.gov/
[6] Loci/MSU: https://simcenter.msstate.edu/
[7] CFD Vision 2030 Study: https://ntrs.nasa.gov/api/citations/20140003093/downloads/20...
[8] Supercomputing SC23: https://sc23.supercomputing.org/
ยังมีพาร์ตที่สองของ Muller ซึ่งทำงานอย่างแข็งขันในสาขานี้ด้วย: https://matthias-research.github.io/pages/tenMinutePhysics/i...
ต่อมาถูกตีพิมพ์เป็นหนังสือ และตอนนี้กลายเป็น Fluid Simulation for Computer Graphics ฉบับที่ 2 แล้ว