2 puan yazan GN⁺ 2023-12-20 | 1 yorum | WhatsApp'ta paylaş
  • 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ç p hesaplanı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

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çin doğrusal denklem ve 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 ε > 0 ile ayarlanan dönme kuvveti hız alanına eklenir
    • Yaklaşık 0–15 gibi düşük confinement değerleri bile büyük fark yaratabilir
    • Daha yüksek değerler stilize, kabaran akışlar üretebilir

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 * z sentezlenir, 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ı T ekler
    • 0 ≤ ρ ≤ 1 yakıt yoğunluğunu ifade eder
    • T > 0 her 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
  • 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ı σ_cool ile ayarlayabilmesi daha kullanışlıdır
  • Yakıt, her zaman adımında yanma oranı γ_fuel doğ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) j biçiminde güncellenir
    • β pozitif kaldırma sabitidir ve j yukarı 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 T sı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

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

  • 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

    • Bu Laplasyen operatörüdür
      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
    • “Her pikselin parlaklığını hemen komşu piksellerin ortalama parlaklığına ayarlamak” kulağa konvolüsyon gibi geliyor
  • 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

    • Kısa cevap: GPU “zaten meşgul” değildir
      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
    • Artık LLM’ler de GPU’da çalıştığına göre, geleceğin GPU’ları kaynakları grafik, fizik ve NPC’lere yönelik yapay zeka arasında paylaştırmak zorunda kalacak
      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
    • Eskiden PhysX hesaplamaları seçilen özel bir GPU’da çalıştırılırdı
      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

  • 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ı

    • Araştırma amaçlı fizik simülasyonlarıyla daha çok ilgileniyorsanız yardımcı olmam zor; ama eğlence odaklı simülasyonlarda SideFX Houdini'yi geçmek zor
      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
    • StarCCM gibi yerlere başvurup o alanda çalışmak da bir yol
    • Eskiden NASA yüklenicisi olarak bu işi yaptım
      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/