Akışkanları, ateşi ve dumanı gerçek zamanlı simüle etme teknolojisi
(andrewkchan.dev)- GPU tabanlı gerçek zamanlı ateş simülasyonu, akışkanlar dinamiğini, ızgara tabanlı paralel hesaplamayı ve yanma, kaldırma kuvveti, render modellerini birleştirerek WebGL demosu olarak uygulanabilir
- Temel model, sıkıştırılamaz ve viskoz olmayan akışı varsayar; boya, sıcaklık ve yakıt gibi skaler alanları hız alanı boyunca taşıyan Semi-Lagrangian advection ile kararlılık ve paralellik elde eder
- Navier-Stokes adımında hız alanı önce kendi üzerinde advekte edilir, ardından pressure projection ile diverjans azaltılır; Poisson denklemi ise Jacobi yinelemesi gibi GPU dostu yaklaşık çözümlerle ele alınır
- Izgara enterpolasyonu ve birinci dereceden Semi-Lagrangian yöntemi türbülans girdaplarını zayıflattığı için, vorticity confinement ve curl noise ile küçük ölçekli dönme detayları güçlendirilir
- Ateş için yakıt yoğunluğu ve sıcaklık alanları eklenir, yanma, soğuma ve termal kaldırma hesaplanır; Planck’s Law tabanlı siyah cisim ışıması renkleriyle render edilerek duman benzeri akışkan alev gibi gösterilir
GPU ile ateş simülasyonunun genel akışı
- Ateş, grafiklerde ilgi çekici bir problem olsa da geçmişte çoğunlukla fizik tabanlı olmayan yöntemlerle taklit edilirdi
- Lord of the Rings, akışkan simülasyonunun maliyeti yüksek olduğu için çok sayıda duman sprite'ı kullandı
- Video oyunları gibi gerçek zamanlı uygulamalar da neredeyse tamamen fiziksel olmayan yaklaşımlara dayanıyordu
- Son 10 yılda GPU'lar sayesinde hızlı akışkan simülasyonu çok daha kolay hale geldi ve temel akışkanlar dinamiği algoritmaları GPU üzerinde uygulanması sezgisel yapılardır
- ILM, 2009'da Harry Potter için ateş modelleme ve render sürecinde bu tür teknikleri kullandı
- NVIDIA, 2014'te oyunlar için ateş ve duman efekt sistemi FlameWorks'ü tanıttı
- Uygulama bir WebGL demosu olarak kurulmuş ve matematiksel olarak vektör hesabı ile diferansiyel denklemler altyapısı gerektiriyor
- Kaynak kod GitHub üzerinde yer alıyor
Önce akışkanı modellemek
- Ateşi oluşturmadan önce akışkanı simüle etmek gerekir; burada sıkıştırılamaz (incompressible) ve viskoz olmayan (inviscid) bir akışkan varsayılır
- 2D hız alanı
u(x, t),N × Nızgara ile temsil edilir ve her ızgara noktası o konumdaki hız değerini taşır - Boya yoğunluğu gibi
ψ(x, t)skaler alanlarının akışkan hızıyla birlikte hareket etmesine advection denir - Her ızgara noktasını doğrudan ileri taşımak paralelleştirmeyi zorlaştırır; birden çok nokta aynı hedef noktaya gidebilir ve zaman aralığı büyüdüğünde kararsızlık oluşabilir
Kararlı advection: Semi-Lagrangian yöntemi
- Kütlenin korunumu yasası ve diverjans teoremi kullanıldığında, sıkıştırılamaz akışta skaler advection denklemi
∂ψ/∂t = -u · ∇ψbiçimine indirgenir - Kararlı yöntem, her ızgara noktasını hız doğrultusunda ileri göndermek yerine mevcut noktadan hız yönünü geriye doğru izleyip önceki konumdaki değeri almaktır
- Bu yöntem Semi-Lagrangian advection olarak bilinir ve Jos Stam tarafından 1999'da geliştirildi
- Her ızgara noktası her yinelemede yalnızca bir kez güncellendiği için GPU paralelleştirmesine uygundur
- Hiçbir ızgara noktası, mevcut noktaların maksimum değerinden daha büyük bir değere güncellenmediği için koşulsuz kararlıdır
- Sabit hız alanı sıkıştırılamazlık koşulunu sağlıyorsa, boya gibi skaler alanlar kararlı biçimde taşınabilir
Hız alanını Navier-Stokes ile güncellemek
- Navier-Stokes equations, sıkıştırılamaz akışta hız alanının zaman içinde nasıl değiştiğini tanımlar
- Akışkanın viskoz olmadığı varsayılarak viskozite terimi çıkarılır ve dış kuvvetler de şimdilik yok sayılırsa, iki temel terim kalır
- Hız alanının kendisini taşıdığı self-advection
- Sıkıştırılamazlık koşulunu sağlamak için gereken pressure
- Simülasyon döngüsü kabaca şu sırayla ilerler
- Hız alanı
u, kendi üzerinde advekte edilir - Basınç
phesaplanır u = u - gradient(p)ile basınç gradyanı çıkarılarak sıkıştırılamazlık zorlanır- Yeni hız alanıyla yoğunluk alanı advekte edilir
- Hız alanı
Basınç hesabında darboğaz Poisson denklemi
- Self-advection sonrasında elde edilen aday hız alanı
u'nin diverjansı sıfır olmak zorunda değildir; bunu basınçla düzeltmek gerekir - Koşullar düzenlendiğinde Poisson equation
∇²p = ∇ · u'biçimini alır - Izgarada diverjans ve Laplacian ayrıklaştırıldığında,
N × Nızgara içinN²doğrusal denklem veN²bilinmeyenden oluşan bir doğrusal sistem elde edilir - Doğrusal sistemi tam çözmek için kullanılan yöntemlerin maliyeti, ızgara boyutuyla süperlineer arttığından gerçek zamanlı simülasyon için ağır kalır
- GPU üzerinde tam çözüm yerine yeterince iyi yaklaşık sonuçları yinelemeli olarak bulmak mümkündür
- Jacobi method, her elemanın tahminini paralel güncellediği için GPU uygulamasına çok uygundur
- Conjugate Gradient ve Multigrid gibi daha hızlı yakınsayan çözümler de GPU'da uygulanabilir
- Duman ve ateşte, suya kıyasla hacim değişimi daha az belirgin olduğundan, basınç doğruluğundan çok advection kalitesi veya uygulama kolaylığı daha önemli olabilir
Girdap detaylarını geri kazandırmak
- Hız alanı ızgarada saklandığında enterpolasyon süreci istenmeyen sayısal yumuşamaya yol açar
- Buna bir de birinci dereceden Semi-Lagrangian advection'ın kaba yaklaşımı eklenince türbülans girdapları kaybolur ve akışkan fazla pürüzsüz, tekdüze görünür
- Çözünürlüğü artırmak bunu hafifletebilir, ancak gerçek zamanlı simülasyonda hesaplama kaynakları sınırlıdır
- Vorticity confinement, her adımda kaybolan küçük detayları bulup güçlendiren bir yöntemdir
- Tam anlamıyla gerçekçi değildir, ancak küçük ölçekli detayları genel olarak fiziksel olarak makul konumlarda korur
- Başlangıçta mühendislik simülasyonlarında helikopter pervaneleri çevresindeki karmaşık akış alanlarını ele almak için tasarlanmıştır
- Her ızgara noktasının curl değeriyle vorticity ölçülür, çevrede vorticity'nin en yüksek olduğu yön hesaplanır ve confinement sabiti
ε > 0ile ayarlanan dönme kuvveti hız alanına eklenir- Yaklaşık
0–15gibi düşük confinement değerleri bile büyük fark yaratabilir - Daha yüksek değerler stilize, kabaran akışlar üretebilir
- Yaklaşık
Curl noise ile türbülans sentezlemek
- Curl noise, mevcut hız alanındaki vorticity'yi ölçüp güçlendirmek yerine, bir gürültü fonksiyonuyla yeni bir skaler vorticity alanı üretir
- Matematiksel olarak rastgele vorticity alanı
φ = rand * zsentezlenir, ardından bu alan mevcut vorticityωye eklenerek son vorticityω* = ω + φelde edilir - Duman ve ateş gibi hızlı hareket eden, güçlü türbülansa sahip akışkanlar vorticity confinement ve curl noise etkisine özellikle duyarlıdır
- Gerçek curl noise alanı
φ, zamanla değişir ve akışkan hareketiyle birlikte advekte edilir
Ateş için yakıt ve sıcaklık eklemek
- Temel akışkan rutini tek başına duman benzeri akışlar üretebilir; ateş ve dumanı simüle etmek için birkaç kanal daha gerekir
- Yanma modeli, yakıt yoğunluğu
ρve sıcaklık alanıTekler0 ≤ ρ ≤ 1yakıt yoğunluğunu ifade ederT > 0her konumdaki sıcaklıktır
- Burada sistemdeki yakıtın zaten tutuştuğu ve sürekli ısı eklediği varsayılır; henüz tutuşmamış yakıt problemi ele alınmaz
- Her zaman adımında yakıt, tanımlanan yanma sıcaklığına göre sıcaklığı yükseltir
- Sıcaklık
T' = max(T, ρ * T_burn)biçiminde güncellenir
- Sıcaklık
- Isı, sıcak bölgeden soğuk bölgeye yayılır ve akışkanın büyük ölçekli hareketi de ısıyı taşır
- Simülasyonda sıcaklık alanı hız alanı boyunca advekte edilir
- Tepkimeye giren moleküller de akışkanla birlikte hareket ettiğinden yakıt alanı da advekte edilir
- Sıcak moleküller Stefan-Boltzmann Law uyarınca sıcaklığı ışık olarak yayar
- Fiziksel olarak doğru bir simülasyonda Stefan-Boltzmann sabiti kullanılır
- Grafik simülasyonlarında ise sanatçının soğuma oranını
σ_coolile ayarlayabilmesi daha kullanışlıdır
- Yakıt, her zaman adımında yanma oranı
γ_fueldoğrultusunda azalır
Termal kaldırma ile sıcak akışkanı yukarı taşımak
- Yalnızca sıcaklık alanını hesaplamak akışın kendisini henüz etkilemez; sıcak havanın yükselmesi ve soğuk havanın alçalması etkisi ayrıca eklenmelidir
- Thermal buoyancy, sıcaklıkla orantılı yukarı yönlü bir kuvveti hız alanına ekler
- Sıkıştırılamaz akış varsayıldığı için gerçek hava genleşmesi modellenmez
- Hız alanı
u' = u + (β T Δt) jbiçiminde güncellenir βpozitif kaldırma sabitidir vejyukarı yönlü birim vektördür
- Yanma modeli ve termal kaldırma birlikte, ateş gibi görünen bir akışkan oluşturmaya yeterlidir
- Uygun kaldırma ve soğuma değerlerinde büyük, kabaran madde sütunları elde edilebilir
- Bu aşamadaki sonuç tam bir alevden çok dumana daha yakındır
- Genel döngü; hızın kendi üzerinde advekte edilmesi, yanma, vorticity confinement, termal kaldırma, pressure projection ve yoğunluk, sıcaklık, yakıt alanlarının adveksiyonu sırasıyla çalışır
Siyah cisim ışımasıyla alev rengini render etmek
- Ateş bir participating mediumdur ve siyah cisim ışıması yoluyla ışık yayar
- Ateşin turuncu ve kırmızı tonları siyah cisim ışımasından gelir; yanan yakıt simülasyonu doğru formülle render edildiğinde görüntü dumandan ateşe dönüşebilir
- Planck’s Law, belirli bir
Tsıcaklığındaki siyah cismin yaydığı ışığın spektral yoğunluğunu açıklar - Fragment shader ile siyah cisim render'ı uygulandığında, akışkan, yanma ve kaldırma modeli üzerine tam bir ateş simülasyonu kurulabilir
- Ele alınmayan bazı genişletme konuları da vardır
- Sabit hacim içindeki simülasyonları çözen ızgara dışı teknikler
- Yarısı dolu bir bardak su gibi, akışkanın ızgara içinde farklı bölgeleri kapladığı değişken alan problemleri
- Dinamik engeller
- Daha doğru siyah cisim ışıması, ışık saçılması ve post-processing efektleri gibi render iyileştirmeleri
1 yorum
Hacker News görüşleri
CFD doktorası yaptım ama vorticity confinement (girdaplılık sınırlaması) tekniğini ve curl-noise turbulence’ı ilk kez gördüm
Endüstriyel CFD gibi Reynolds sayısının daha yüksek olduğu alanlarda, sayısal yöntemin yapay sönümünü gürültüyle dengelemeye çalışmak genelde istenen bir yaklaşım değildir
Aksine, yüksek Reynolds sayılı simülasyonları kararlı hâle getirmek için çoğu zaman yapay sönüm istenir; bilgisayar grafiklerinde ise fiziksel olarak doğru olmasından çok inandırıcı görünmesi daha önemli görünüyor
Doğru görünmesi bile gerekmez; yalnızca havalı görünmesi yeterlidir
Bir fizik meraklısı olarak atari salonunda fizik yasalarının çiğnendiği sahneleri gösterdiğimde insanlar gülerdi
Nintendo’da Mario World üzerinde çalışmış bir fizikçiyle yapılmış çevrilmiş bir röportaj ilginçti; Mario dünyasının fiziğinin “gerçek” fizikle aynı olmasa da gerçek fizik gibi tutarlı kuralları olduğunu ve bunun oyuncuların oyunda neler yapabileceklerini anlaması ve bulmacaları çözmesi için önemli olduğunu vurguluyordu
O makaledeki temel fikri kullanarak gaz devi gezegen dokuları üreten epey iyi bir program yaptım: https://github.com/smcameron/gaseous-giganticus
“Unreal Engine bunu birkaç saniyede yaparken sizin CFD yazılımınız neden tek bir simülasyon için saatler harcıyor?” sorusunu birden fazla kez duydum
https://en.wikipedia.org/wiki/John_Steinhoff
https://en.wikipedia.org/wiki/Vorticity_confinement
İlgili makaleler de var:
https://www.researchgate.net/publication/239547604_Modificat...
https://www.researchgate.net/publication/265066926_Computati...
Bir zamanlar bir yerde bir yazı okuyup C ile oyuncak düzeyinde, çok basit bir alev simülasyonu yapmıştım
Her pikselin parlaklığını, hemen komşu piksellerin ortalama parlaklığına ayarlayıp aşağıdan yukarı doğru hesaplamak yeterli
Alta sağa sola hareket eden birkaç “sıcak” piksel ekleyince anında alev oluşuyor; kodu da çok az ve kalkülüs olmadan epey güzel görünüyor
Tek boyutta bu sadece ikinci türev, yani eğriliktir; tepe ne kadar keskinse o kadar negatif, çukur ne kadar keskinse o kadar pozitiftir
Değeri o miktarda değiştirirseniz ortalama alma etkisi oluşur; ayrıklaştırılmış biçimi kelimenin tam anlamıyla ortalama almaktır
Aslında başından beri kalkülüs yapıyordunuz
Yolu bilmekle o yolda yürümek farklı şeylerdir
Bunu sezgisel grafiklerle anlatan bir 3Blue1Brown videosu da var: https://youtube.com/watch?v=ToIXSwZ1pJU
Oyunlar için ateş ve duman simülasyonundan, GPU üzerinde akışkan simülasyonundan söz ediliyor; ama bu efektler oyun içinde çalışacaksa GPU zaten meşgul değil mi diye düşünüyorum
Bir CFD problemini çalıştırırken aynı anda render almak epey büyük bir yük gibi görünüyor
dGPU render ile ilgili işleri yaparken bunun iGPU’da çalıştırılıp çalıştırılamayacağını, yoksa iGPU çok zayıf olduğu için CPU’ya indirmeyi tercih etmenin daha mı iyi olacağını da merak ediyorum
Günümüz GPU’ları çok güçlü; fizik, gösterişli render pass’leri, akışkan simülasyonu, “oyun AI” birim yol bulması gibi işleri 100 FPS’in üzerinde işleyebilir
Uzun cevap: 60 FPS’in üzerindeki çok hızlı “slayt gösterisi” karelerini render ederken aradaki süre kare bütçesidir; genelde 5-30 ms içinde bir sonraki karenin durumunu hesaplamak ve render için gereken hesaplamaları yapmak gerekir
Bunun içine haritadaki birim hareketleri, alev fiziği hesaplamaları, arazi dokusu kopyalama, materyalli vertekslerin render edilmesi gibi işler girebilir; birçok oyun motorunda GPU her karede böyle ayrı hesaplamalardan onlarcasını yürütür
GPU temelde ana bilgisayara bağlı yardımcı bir bilgisayardır; her karede ona birden çok iş verirsiniz, sonuçları döndürür ve bu sonuçlar birleştirilerek oyun gibi görünür
iGPU’yu neredeyse kimse kullanmaz
Genelde ana dGPU’ya kıyasla tamamen işe yaramaz olduğundan göz ardı edilir
Bunu dengeleme dönemi ilginç olacak gibi; giderek daha fazla yerel ve uzak bilişim kaynağının yükü paylaşacağını düşünüyorum
Red Faction’da sürekli yıkılan duvarlara bakarken o ayarı atadığımı ya da fark ettiğimi hatırlıyorum
Neredeyse Minecraft gibiydi; ama Mars’ta, elinde roketatarla oynanan hâli
GPU kullanmak için illa oyun oynuyor olmanız gerekmez
Günümüzde GPU modu olan pek çok render yazılımı da var
Ancak GPU algoritmaları yüksek derecede paralelleştirildiği için çoğu zaman CPU simülasyon algoritmalarından farklıdır
EmberGen, tüketici tipi GPU'larda ateş ve dumanı gerçek zamanlı simüle eden, ayrıca düğüm tabanlı iş akışını desteklediği için yeni efektler oluşturmayı kolaylaştıran gerçekten çılgın bir yazılım
Eskiden saatler süren iş akışları artık birkaç dakikada ayarlanabilir hâle geldi
https://jangafx.com/software/embergen/
Bu yazının EmberGen hakkında olacağını sanmıştım; açıkçası EmberGen'in HN'de pek büyük ilgi görmemiş olması biraz üzücü: https://hn.algolia.com/?dateRange=all&page=0&prefix=true&que...
EmberGen/JangaFX ile bir bağım yok, sadece memnun bir müşteriyim
https://odin-lang.org/showcase/embergen/
Bu tür şeyleri seviyorsanız Ten Minute Physics de ilginizi çekebilir
Özellikle 17. bölüm, “How to write an Eulerian Fluid Simulator with 200 lines of code”, çok iyi
https://matthias-research.github.io/pages/tenMinutePhysics/i...
Matematik bölümünden yazılım mühendisi olmuş biri olarak CFD simülasyonuna giriş yapmak için hangi kaynakları önerirsiniz, merak ediyorum
Konu gerçekten çok ilginç ama vektör kalkülüs veya kısmi diferansiyel denklemlerle uğraşmayalı uzun zaman oldu; matematiğim epey paslandı
https://www.youtube.com/watch?v=zxiqA8_CiC4
Ücretsiz, ticari olmayan “Apprentice” sürümünde yalnızca render ve işbirliği özellikleri kısıtlı
Yine de oldukça derin bir araç
Yazılım tarafındayken bu sektöre geçince, böyle araçları öğrenme iş akışı tamamen farklı geliyor
Birçok kişi Houdini'nin bir 3D modelleme programından çok bir IDE'ye benzediğini söyler; birçok açıdan katılıyorum
Blender gibi görsel araçlar kullanmak yerine neredeyse tamamen düğüm ağları oluşturup nitelikleri ve parametreleri değiştirerek çalışıyorsunuz
Çoğu şeyi Python ile yapabilirsiniz ve 3ds Max gibi şeylerden daha temizdir; ama derlenmediği için büyük simülasyonlarda performansı kötüdür
Kendi C benzeri dili VEX de kullanışlı; daha karmaşık matematik gibi ince işler için daha ayrıntılı düğüm sistemleri de var
Teknik açıdan neredeyse tamamen veri odaklı bir iş akışı
Ancak “doküman okuyarak öğrenen” biriyseniz, öğreticileri hızlıca sevmeye başlamanız gerekecek
Benim karşılaştığım herhangi bir ortam veya paradigmadan çok farklı; topluluk genel olarak yardımsever olsa da uzmanlık laneti oldukça belirgin
Gerçekten yapmak istiyorsanız bu alanda bir iş bulmanız iyi olur; Federal veya Contractor tarafında Marshall Space Flight Center ya da Ames'e başvurmayı düşünebilirsiniz
Ames'te Top500'e göre Aitken [#85, 9.07 PFlops], Pleiades [#132, 5.95 PFlops], Electra [#143, 5.44 PFlops] sistemleri var
GRC, LARC ve JSC'de de bazıları var
En azından birkaç yıl önce Contractor/Federal entegrasyonu oldukça iyiydi; para tahsisi dışında neredeyse şeffaftı
NASA içinde MSFC'nin Propulsion Structural, Thermal & Fluid Analysis [2][3] ve Ames'in Entry Systems [4] grupları epey bilinir
O dönemde Overflow/LARC [5] veya Loci/Mississippi State University [6] kullanarak hareketli örtüşen ızgaralar, yaklaşık 10–20 tür reaktif yanma kimyasal türü ve Lagrangian buharlaşan parçacık dinamiği içeren, yaklaşık 100 milyon hücre ölçeğinde araç veya araç+fırlatma rampası Hybrid RANS/LES simülasyonları çalıştırıyorduk
SSME ve SRB birlikte ateşleniyor, fırlatma sırasında su baskılama sistemi de dâhil ediliyordu
Ancak bu bilgiler 10 yıl öncesine ait; güncel son durumun ne olduğunu bilmiyorum, muhtemelen şimdi daha ileridedir
Sektörün hangi yöne ilgi duyduğunu anlamak istiyorsanız, eski olsa da 2014 CFD Vision 2030 Study fena bir giriş kaynağı değil [7]
Supercomputing için bilet alıp etrafta dolaşmak da iyi olur
Bu yıl Denver'da düzenlendi [8]
Ancak odak “büyük ölçek” tarafında olduğu için çoğunlukla dev hava durumu simülasyonları veya bulutsu dinamikleri görürsünüz
Konferansın kendisini seviyorum; yine de #CPUs/#GPUs/#FPGAs++ gibi ölçek başarıları yoksa dikkat çekmek zor
NASA dışındaki kamu tarafında NIST(Gaithersburg), DOE(Oak Ridge, Sandia, Los Alamos), Air Force(AF Research Lab) ve Huntington Beach var
[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] Biraz eski örnekler: 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/
Bu alanda aktif olarak çalışan Muller’in ikinci bölümü de var: https://matthias-research.github.io/pages/tenMinutePhysics/i...
Daha sonra kitap olarak yayımlandı ve şu anda 2. baskısı olan Fluid Simulation for Computer Graphics haline geldi