2 poin oleh GN⁺ 2023-12-20 | 1 komentar | Bagikan ke WhatsApp
  • 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 grid N × 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 u oleh dirinya sendiri
    • Hitung tekanan p
    • Paksa ketaktermampatan dengan mengurangkan gradien tekanan melalui u = u - gradient(p)
    • Adveksikan medan kerapatan menggunakan medan kecepatan baru

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 persamaan linear dan variabel tak diketahui untuk grid N × 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 ε > 0 ditambahkan ke medan kecepatan
    • Nilai confinement rendah sekitar 0–15 saja sudah dapat membuat perbedaan besar
    • Nilai yang lebih tinggi dapat menghasilkan aliran billowing yang distilisasi

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 temperatur T
    • 0 ≤ ρ ≤ 1 adalah kerapatan bahan bakar
    • T > 0 adalah 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)
  • 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 dan j adalah 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

 
GN⁺ 2023-12-20
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

  • 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

    • Itu adalah operator Laplacian
      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
    • “Mengatur kecerahan tiap piksel menjadi rata-rata kecerahan piksel-piksel yang tepat bertetangga dengannya” terdengar seperti konvolusi
  • 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

    • Jawaban singkatnya, GPU tidak “sudah sibuk”
      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
    • Sekarang LLM juga berjalan di GPU, jadi GPU masa depan harus membagi sumber daya antara grafis, fisika, dan AI untuk NPC
      Era menyeimbangkan hal itu sepertinya akan menarik, dan rasanya sumber daya komputasi lokal dan jarak jauh akan makin berbagi beban
    • Dulu perhitungan PhysX sering dijalankan di GPU khusus yang dipilih
      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

  • 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

    • Kalau lebih tertarik pada simulasi fisika untuk riset, saya sulit membantu, tetapi untuk simulasi yang berfokus pada hiburan, sulit mengalahkan SideFX Houdini
      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
    • Melamar ke tempat seperti StarCCM dan bekerja di bidang itu juga bisa menjadi cara
    • Dulu saya melakukan pekerjaan ini sebagai kontraktor NASA
      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/