Teknik untuk Mensimulasikan Fluida, Api, dan Asap secara Real-Time
(andrewkchan.dev)- Simulasi api real-time berbasis GPU menggabungkan dinamika fluida, komputasi paralel berbasis grid, serta model pembakaran, buoyancy, dan rendering, sehingga dapat diimplementasikan sebagai demo WebGL
- Model dasarnya mengasumsikan aliran tak termampatkan dan tak kental, lalu memperoleh stabilitas dan paralelisme melalui adveksi semi-Lagrangian yang mengangkut medan skalar seperti pewarna, temperatur, dan bahan bakar menggunakan medan kecepatan
- Pada tahap Navier-Stokes, medan kecepatan diadveksikan oleh dirinya sendiri, lalu divergensi dikurangi melalui proyeksi tekanan; persamaan Poisson ditangani dengan solusi aproksimasi yang ramah GPU seperti iterasi Jacobi
- Interpolasi grid dan metode semi-Lagrangian orde pertama melemahkan pusaran turbulen, sehingga detail rotasi kecil diperkuat dengan vorticity confinement dan curl noise
- Api menambahkan kerapatan bahan bakar dan medan temperatur untuk menghitung pembakaran, pendinginan, dan thermal buoyancy, lalu dirender dengan warna radiasi benda hitam berbasis Planck’s Law agar fluida seperti asap terlihat seperti nyala api
Alur lengkap mensimulasikan api dengan GPU
- Api adalah masalah yang menarik dalam grafika, tetapi dulu umumnya ditiru dengan cara yang tidak berbasis fisika
- Lord of the Rings menggunakan banyak sprite asap karena biaya simulasi fluida yang tinggi
- Aplikasi real-time seperti video game juga hampir sepenuhnya bergantung pada pendekatan nonfisik
- Dalam 10 tahun terakhir, GPU membuat simulasi fluida cepat menjadi lebih mudah, dan algoritme dasar dinamika fluida cukup intuitif untuk diimplementasikan di GPU
- ILM menggunakan teknik semacam ini pada 2009 untuk pemodelan dan rendering api di Harry Potter
- NVIDIA merilis FlameWorks, sistem efek api dan asap untuk game, pada 2014
- Implementasinya disusun sebagai demo WebGL, dan secara matematis memerlukan latar belakang kalkulus vektor serta persamaan diferensial
- Kode sumber tersedia di GitHub
Memodelkan fluida terlebih dahulu
- Sebelum membuat api, kita perlu mensimulasikan fluida; di sini diasumsikan fluida tak termampatkan (incompressible) dan tak kental (inviscid)
- Medan kecepatan 2D
u(x, t)direpresentasikan sebagai gridN × N, dan setiap titik grid memiliki nilai kecepatan pada posisi tersebut - Proses bergeraknya medan skalar
ψ(x, t), seperti kerapatan pewarna, mengikuti kecepatan fluida disebut adveksi (advection) - Cara sederhana dengan memindahkan setiap titik grid ke depan sulit diparalelkan, beberapa titik grid bisa berpindah ke titik grid tujuan yang sama, dan dapat menjadi tidak stabil jika interval waktu membesar
Adveksi stabil: metode semi-Lagrangian
- Dengan menggunakan hukum kekekalan massa dan teorema divergensi, persamaan adveksi skalar untuk aliran tak termampatkan dapat diringkas menjadi
∂ψ/∂t = -u · ∇ψ - Metode yang stabil adalah, alih-alih mengirim setiap titik grid ke depan mengikuti kecepatan, menelusuri mundur dari titik grid saat ini ke arah berlawanan kecepatan dan mengambil nilai dari posisi sebelumnya
- Metode ini adalah Semi-Lagrangian advection, dibuat oleh Jos Stam pada 1999
- Setiap titik grid hanya diperbarui sekali per iterasi, sehingga mudah diparalelkan di GPU
- Tidak ada titik grid yang diperbarui menjadi nilai yang lebih besar daripada nilai maksimum titik-titik grid sebelumnya, sehingga stabil tanpa syarat
- Jika medan kecepatan tetap memenuhi kondisi tak termampatkan, medan skalar seperti pewarna dapat diangkut secara stabil
Memperbarui medan kecepatan dengan Navier-Stokes
- Navier-Stokes equations mendefinisikan bagaimana medan kecepatan fluida berubah seiring waktu dalam aliran tak termampatkan
- Dengan mengasumsikan fluida tak kental, suku viskositas dihilangkan, dan jika gaya luar sementara diabaikan, dua suku utama yang tersisa adalah
- self-advection, yaitu medan kecepatan mengangkut dirinya sendiri
- pressure untuk memenuhi kondisi tak termampatkan
- Loop simulasi kira-kira berjalan dalam urutan berikut
- Adveksikan medan kecepatan
uoleh dirinya sendiri - Hitung tekanan
p - Paksa ketaktermampatan dengan mengurangkan gradien tekanan melalui
u = u - gradient(p) - Adveksikan medan kerapatan menggunakan medan kecepatan baru
- Adveksikan medan kecepatan
Perhitungan tekanan menjadi bottleneck karena persamaan Poisson
- Tidak ada jaminan bahwa kandidat medan kecepatan
u'yang diperoleh setelah self-advection memenuhi kondisi divergensi nol, sehingga perlu dikoreksi dengan tekanan - Jika kondisinya dirapikan, hasilnya menjadi Poisson equation berbentuk
∇²p = ∇ · u' - Jika divergensi dan Laplacian didiskretisasi pada grid, akan muncul sistem linear dengan
N²persamaan linear danN²variabel tak diketahui untuk gridN × N - Metode penyelesaian sistem linear yang eksak memiliki biaya yang tumbuh superlinear terhadap ukuran grid, sehingga memberatkan untuk simulasi real-time
- Di GPU, alih-alih solusi eksak, kita dapat mencari aproksimasi yang cukup baik secara iteratif
- Jacobi method cocok untuk implementasi GPU karena memperbarui estimasi tiap elemen secara paralel
- Metode yang konvergensinya lebih cepat seperti Conjugate Gradient dan Multigrid juga dapat diimplementasikan di GPU
- Pada asap dan api, perubahan volume tidak sejelas air, sehingga kualitas adveksi atau kemudahan implementasi bisa lebih penting daripada akurasi tekanan
Menghidupkan kembali detail pusaran
- Saat medan kecepatan disimpan dalam grid, terjadi penghalusan numerik yang tidak diinginkan selama proses interpolasi
- Jika ditambah aproksimasi kasar dari adveksi semi-Lagrangian orde pertama, pusaran turbulen menghilang, dan fluida menjadi terlalu halus serta monoton
- Hal ini dapat dikurangi dengan menaikkan resolusi, tetapi sumber daya komputasi terbatas pada simulasi real-time
- Vorticity confinement adalah metode untuk menemukan dan memperkuat detail kecil yang hilang pada setiap langkah
- Metode ini tidak sepenuhnya realistis, tetapi mempertahankan detail berskala kecil di lokasi yang umumnya sesuai secara fisik
- Awalnya dirancang untuk menangani medan aliran kompleks di sekitar bilah helikopter dalam simulasi rekayasa
- Vorticity diukur dengan curl pada setiap titik grid, arah dengan vorticity tinggi di sekitarnya dihitung, lalu gaya rotasi yang diatur dengan konstanta confinement
ε > 0ditambahkan ke medan kecepatan- Nilai confinement rendah sekitar
0–15saja sudah dapat membuat perbedaan besar - Nilai yang lebih tinggi dapat menghasilkan aliran billowing yang distilisasi
- Nilai confinement rendah sekitar
Menyintesis turbulensi dengan curl noise
- Curl noise tidak mengukur dan memperkuat vorticity dari medan kecepatan yang ada, melainkan membuat medan vorticity skalar baru dari fungsi noise
- Secara matematis, setelah menyintesis medan vorticity acak
φ = rand * z, medan itu ditambahkan ke vorticity yang adaωuntuk membuat vorticity akhirω* = ω + φ - Fluida yang bergerak cepat dan sangat turbulen seperti asap dan api sangat dipengaruhi oleh vorticity confinement dan curl noise
- Medan curl noise aktual
φberubah seiring waktu dan ikut diadveksikan oleh aliran fluida
Menambahkan bahan bakar dan temperatur untuk api
- Rutinitas fluida dasar saja dapat membuat aliran seperti asap, dan untuk mensimulasikan api serta asap diperlukan beberapa channel tambahan
- Model pembakaran menambahkan kerapatan bahan bakar
ρdan medan temperaturT0 ≤ ρ ≤ 1adalah kerapatan bahan bakarT > 0adalah temperatur di setiap posisi
- Di sini diasumsikan bahan bakar dalam sistem sudah tersulut dan terus menambahkan panas; masalah bahan bakar yang belum tersulut tidak dibahas
- Pada setiap timestep, bahan bakar meningkatkan temperatur sesuai temperatur pembakaran yang ditentukan
- Temperatur diperbarui dalam bentuk
T' = max(T, ρ * T_burn)
- Temperatur diperbarui dalam bentuk
- Panas berdifusi dari area panas ke area dingin, dan aliran besar fluida juga mengangkut panas
- Dalam simulasi, medan temperatur diadveksikan oleh medan kecepatan
- Karena molekul yang bereaksi juga bergerak bersama fluida, medan bahan bakar juga diadveksikan
- Molekul panas melepaskan temperaturnya sebagai cahaya menurut Stefan-Boltzmann Law
- Jika simulasi fisiknya akurat, konstanta Stefan-Boltzmann digunakan
- Dalam simulasi grafis, lebih berguna jika artist dapat mengatur laju pendinginan
σ_cool
- Bahan bakar berkurang pada setiap timestep sesuai laju pembakaran
γ_fuel
Mengangkat fluida panas ke atas dengan thermal buoyancy
- Jika hanya menghitung medan temperatur, belum ada pengaruh pada aliran fluida, sehingga perlu ditambahkan efek udara panas yang naik dan udara dingin yang turun
- Thermal buoyancy menambahkan gaya ke atas yang sebanding dengan temperatur ke medan kecepatan
- Karena mengasumsikan aliran tak termampatkan, ekspansi udara sebenarnya tidak ditangani
- Medan kecepatan diperbarui dalam bentuk
u' = u + (β T Δt) j βadalah konstanta buoyancy positif danjadalah vektor satuan ke atas
- Dengan menambahkan model pembakaran dan thermal buoyancy, kita dapat membuat fluida yang tampak seperti api
- Dengan nilai buoyancy dan pendinginan yang sesuai, kita dapat memperoleh kolom materi besar yang mengembang
- Hasil pada tahap ini lebih mirip asap daripada nyala api yang akurat
- Loop lengkap terdiri dari urutan self-advection kecepatan, pembakaran, vorticity confinement, thermal buoyancy, proyeksi tekanan, lalu adveksi kerapatan, temperatur, dan bahan bakar
Merender warna nyala api dengan radiasi benda hitam
- Api adalah participating medium, dan memancarkan cahaya melalui radiasi benda hitam
- Warna oranye dan merah pada api berasal dari radiasi benda hitam, dan jika simulasi bahan bakar yang sedang terbakar dirender dengan rumus yang benar, transisi dari asap ke api dapat dilakukan
- Planck’s Law menjelaskan kerapatan spektral cahaya yang dipancarkan oleh benda hitam pada temperatur tertentu
T - Dengan mengimplementasikan rendering benda hitam dalam fragment shader, simulasi api yang lengkap dapat dibuat di atas model fluida, pembakaran, dan buoyancy
- Masih ada topik perluasan yang belum dibahas
- Teknik non-grid-based untuk menyelesaikan simulasi di dalam volume tetap
- Masalah domain variabel, yaitu fluida menempati area berbeda dalam grid, seperti air dalam gelas yang terisi setengah
- Rintangan dinamis
- Metode peningkatan rendering seperti radiasi benda hitam yang lebih akurat, hamburan cahaya, dan efek pascaproses
1 komentar
Komentar Hacker News
Saya pernah mengambil PhD CFD, tetapi baru pertama kali melihat teknik vorticity confinement dan curl-noise turbulence
Di ranah dengan bilangan Reynolds lebih tinggi seperti CFD industri, pendekatan untuk meniadakan disipasi buatan dari metode numerik dengan noise biasanya tidak diinginkan
Justru sering kali disipasi buatan diinginkan untuk menstabilkan simulasi bilangan Reynolds tinggi, dan dalam computer graphics, terlihat meyakinkan tampaknya lebih penting daripada akurat secara fisika
Bahkan tidak perlu terlihat akurat, cukup terlihat keren saja
Sebagai penggemar fisika, saya dulu sering membuat orang tertawa saat menunjuk adegan di arcade yang melanggar hukum fisika
Ada wawancara terjemahan yang menarik dengan seorang fisikawan yang mengerjakan Mario World di Nintendo; ia menekankan bahwa fisika dunia Mario, meski tidak sama dengan fisika “dunia nyata”, memiliki aturan yang konsisten seperti fisika nyata, dan itu penting agar pemain memahami apa yang bisa mereka lakukan di game serta memecahkan puzzle
Saya membuat program yang cukup lumayan untuk membuat tekstur planet gas dengan memakai ide dasar dari makalah itu: https://github.com/smcameron/gaseous-giganticus
Lebih dari sekali saya mendapat pertanyaan, “kenapa Unreal Engine bisa melakukannya dalam beberapa detik, sementara software CFD Anda butuh berjam-jam untuk satu simulasi?”
https://en.wikipedia.org/wiki/John_Steinhoff
https://en.wikipedia.org/wiki/Vorticity_confinement
Ada juga beberapa makalah terkait:
https://www.researchgate.net/publication/239547604_Modificat...
https://www.researchgate.net/publication/265066926_Computati...
Dulu saya pernah membaca tulisan di suatu tempat lalu membuat simulasi api yang sangat sederhana, setingkat mainan, dalam C
Cukup atur kecerahan tiap piksel menjadi rata-rata kecerahan piksel-piksel yang tepat bertetangga dengannya, lalu hitung dari bawah ke atas
Tambahkan saja beberapa piksel “panas” yang bergerak ke kiri-kanan di bagian bawah, maka api langsung muncul; kodenya juga sangat sedikit dan terlihat cukup keren tanpa kalkulus
Dalam satu dimensi, itu hanya turunan kedua, yaitu kelengkungan; semakin tajam puncaknya semakin negatif, semakin tajam lembahnya semakin positif
Mengubah nilai sebesar itu menghasilkan efek perataan, dan bentuk diskretnya secara harfiah adalah mengambil rata-rata
Sebenarnya selama ini Anda sedang melakukan kalkulus
Mengetahui jalan dan berjalan di jalan itu adalah dua hal berbeda
Ada juga video 3Blue1Brown yang menjelaskannya dengan grafis intuitif: https://youtube.com/watch?v=ToIXSwZ1pJU
Saat membicarakan simulasi api dan asap untuk game, serta simulasi fluida di GPU, saya jadi berpikir kalau efek seperti ini berjalan di game, bukankah GPU sudah sibuk?
Menjalankan masalah CFD sekaligus melakukan rendering tampaknya beban yang cukup besar
Saya juga penasaran apakah hal seperti ini bisa dijalankan di iGPU sementara dGPU menangani pekerjaan terkait rendering, atau apakah iGPU terlalu lemah sehingga lebih baik dialihkan ke CPU
GPU modern sangat kuat sehingga dapat menangani fisika, render pass yang mewah, simulasi fluida, pathfinding unit untuk “AI game”, dan sebagainya pada lebih dari 100 FPS
Jawaban panjangnya, waktu di antara rendering frame “slideshow” yang sangat cepat di atas 60 FPS adalah anggaran frame, dan biasanya dalam 5–30 ms Anda harus menghitung status frame berikutnya serta komputasi yang diperlukan untuk rendering
Di dalamnya bisa termasuk pergerakan unit di peta, perhitungan fisika api, penyalinan tekstur terrain, rendering vertex dengan material, dan di banyak game engine GPU melakukan puluhan komputasi terpisah seperti ini setiap frame
GPU pada dasarnya adalah komputer pendamping yang terpasang pada komputer utama; setiap frame, Anda melemparkan berbagai pekerjaan kepadanya, ia mengeluarkan hasil, lalu hasil itu digabungkan agar terlihat seperti game
iGPU hampir tidak digunakan siapa pun
Biasanya dibandingkan dGPU utama, iGPU benar-benar tidak berguna sehingga cenderung diabaikan
Era menyeimbangkan hal itu sepertinya akan menarik, dan rasanya sumber daya komputasi lokal dan jarak jauh akan makin berbagi beban
Saya ingat pernah mengalokasikan atau menyadari pengaturan itu sambil melihat dinding yang terus-menerus hancur di Red Faction
Hampir seperti Minecraft, tetapi di Mars sambil membawa rocket launcher
Untuk memakai GPU, tidak harus sedang bermain game
Saat ini juga banyak software rendering yang punya mode GPU
Namun algoritma GPU sangat diparalelkan, jadi sering kali berbeda dari algoritma simulasi CPU
EmberGen adalah software yang benar-benar gila: bisa menyimulasikan api dan asap secara real-time di GPU konsumen, dan juga mendukung alur kerja berbasis node sehingga mudah membuat efek baru
Alur kerja yang dulu memakan waktu berjam-jam kini bisa disesuaikan dalam hitungan menit
https://jangafx.com/software/embergen/
Saya sempat mengira tulisan ini akan membahas EmberGen, dan jujur agak disayangkan EmberGen tidak mendapat banyak perhatian di HN: https://hn.algolia.com/?dateRange=all&page=0&prefix=true&que...
Tidak ada hubungan dengan EmberGen/JangaFX, hanya pelanggan yang puas
https://odin-lang.org/showcase/embergen/
Kalau suka hal seperti ini, Ten Minute Physics juga akan menarik
Khususnya bab 17, “How to write an Eulerian Fluid Simulator with 200 lines of code”, bagus
https://matthias-research.github.io/pages/tenMinutePhysics/i...
Saya penasaran, materi rekomendasi apa yang bagus bagi seseorang berlatar belakang matematika yang kemudian menjadi software engineer untuk mulai mempelajari simulasi CFD
Topik ini benar-benar menarik, tetapi sudah lama tidak mengerjakan kalkulus vektor atau persamaan diferensial parsial, jadi matematika saya sudah cukup berkarat
https://www.youtube.com/watch?v=zxiqA8_CiC4
Versi “Apprentice” nonkomersial gratis hanya membatasi fitur rendering dan kolaborasi
Namun ini tool yang cukup dalam
Kalau berpindah dari dunia software ke bidang ini, alur kerja mempelajari tool semacam ini benar-benar berbeda
Banyak orang bilang Houdini lebih mirip IDE daripada program pemodelan 3D, dan dalam banyak hal saya setuju
Alih-alih memakai tool visual seperti Blender, hampir semuanya dilakukan dengan membuat jaringan node serta mengubah atribut dan parameter
Sebagian besar bisa dilakukan dengan Python dan lebih rapi daripada sesuatu seperti 3ds Max, tetapi karena tidak dikompilasi, performanya buruk pada simulasi besar
Bahasa internal mirip C miliknya, VEX, juga cukup layak dipakai, dan ada sistem node yang lebih terperinci untuk pekerjaan detail seperti matematika yang lebih kompleks
Dari sisi teknis, hampir semuanya adalah alur kerja berorientasi data
Namun kalau Anda tipe yang “belajar dengan membaca dokumentasi”, Anda harus cepat-cepat menyukai tutorial
Ini sangat berbeda dari lingkungan atau paradigma apa pun yang pernah saya tangani, dan komunitasnya umumnya ramah, tetapi kutukan keahlian di sana cukup parah
Kalau benar-benar ingin melakukannya, sebaiknya ambil pekerjaan di bidang tersebut, dan layak mencoba melamar ke Marshall Space Flight Center atau Ames di sisi Federal atau Contractor
Ames memiliki sistem Top500 Aitken [#85, 9.07 PFlops], Pleiades [#132, 5.95 PFlops], Electra [#143, 5.44 PFlops]
GRC, LARC, dan JSC juga punya sebagian
Setidaknya beberapa tahun lalu, integrasi Contractor/Federal cukup baik, dan selain alokasi uang, hampir transparan
Di dalam NASA, grup Propulsion Structural, Thermal & Fluid Analysis [2][3] di MSFC dan grup Entry Systems [4] di Ames cukup dikenal
Saat itu kami memakai Overflow/LARC [5] atau Loci/Mississippi State University [6] untuk menjalankan simulasi Hybrid RANS/LES kendaraan atau kendaraan+landasan peluncuran berskala sekitar 100 juta sel, dengan mesh overset bergerak, sekitar 10–20 spesies kimia pembakaran reaktif, dan dinamika partikel evaporasi Lagrangian
SSME dan SRB dinyalakan bersama, dan sistem peredaman air saat peluncuran juga disertakan
Namun informasi ini dari 10 tahun lalu, jadi saya tidak tahu tingkat mutakhir saat ini, dan sekarang mestinya sudah lebih maju
Kalau ingin tahu arah yang diminati industri, meski sudah lama, CFD Vision 2030 Study tahun 2014 tidak buruk sebagai materi pengantar [7]
Mendapat tiket Supercomputing lalu berkeliling di sana juga bagus
Tahun ini diadakan di Denver [8]
Namun fokusnya ada pada skala “besar”, jadi Anda terutama akan melihat simulasi cuaca raksasa atau dinamika nebula
Konferensinya sendiri bagus, tetapi memang sulit mendapat perhatian kalau tidak punya capaian skala seperti #CPUs/#GPUs/#FPGAs++
Untuk sisi pemerintahan di luar NASA, ada 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] Contoh yang agak lama: 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] Studi CFD Vision 2030: https://ntrs.nasa.gov/api/citations/20140003093/downloads/20...
[8] Supercomputing SC23: https://sc23.supercomputing.org/
Ada juga bagian kedua dari Muller, yang aktif di bidang ini: https://matthias-research.github.io/pages/tenMinutePhysics/i...
Kemudian diterbitkan sebagai buku, dan kini menjadi edisi ke-2 Fluid Simulation for Computer Graphics