Simulering och visualisering av en Eulerisk fluid på grafikkortet

Relevanta dokument
Realistisk simulering och visualisering av uider

Inledning. Kapitel Bakgrund. 1.2 Syfte

Ordinära differentialekvationer,

Gel esimulering 22 mars 2008

Modelleringsprojekt 2013

Hydrodynamik Mats Persson

FFM234, Datoruppgift 2: Värmeledning

Exempel ode45 parametrar Miniprojekt 1 Rapport. Problemlösning. Anastasia Kruchinina. Uppsala Universitet. Januari 2016

Procedurell 3D-eld på grafikkortet

Lösningsskiss för tentamen Vektorfält och klassisk fysik (FFM232)

Byggnationen av Cheopspyramiden - ett visualiseringsprojekt. Mathias Bergqvist, Rikard Gehlin, Henrik Gunnarsson

FFM232, Klassisk fysik och vektorfält - Föreläsningsanteckningar

TMA226 datorlaboration

HAND TRACKING MED DJUPKAMERA

Numerisk lösning till den tidsberoende Schrödingerekvationen.

LAB 4. ORDINÄRA DIFFERENTIALEKVATIONER. 1 Inledning. 2 Eulers metod och Runge-Kuttas metod

Procedurell grottgenerator och eld i GLSL. Marcus Widegren

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Tentamen TNM061, 3D-grafik och animering för MT2. Tisdag 3/ kl 8-12 TP51, TP52, TP54, TP56, TP41, TP43. Inga hjälpmedel

Flervariabelanalys och Matlab Kapitel 4

FMNF15 HT18: Beräkningsprogrammering Numerisk Analys, Matematikcentrum

Vektoranalys I. Anders Karlsson. Institutionen för elektro- och informationsteknik

1 Vektorer och tensorer

Simulering och rendering av gräs och vind i realtid

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Tentamen TNM061, 3D-grafik och animering för MT2. Onsdag 20/ kl SP71. Inga hjälpmedel

Tekniska beräkningar. Vad är tekn beräkningar? Vad är beräkningsvetenskap? Informationsteknologi. Informationsteknologi

0.31 = f(x 2 ) = b 1 + b 2 (x 3 x 1 ) + b 3 (x 3 x 1 )(x 3 x 2 ) = ( ) + b 3 ( )(

23 Konservativa fält i R 3 och rotation

Tentamen del 2 SF1511, , kl , Numeriska metoder och grundläggande programmering

Procedurell renderingsmotor i Javascript och HTML5

LUNDS UNIVERSITET. Parallell exekvering av Float32 och INT32 operationer

Universe Engine Rapport

SF1544 LABORATION 2 INTEGRATION, MONTE-CARLO OCH BLACK-SCHOLES EKVATION FÖR OPTIONER

Två gränsfall en fallstudie

Obligatoriska uppgifter i MATLAB

Beräkningsvetenskap introduktion. Beräkningsvetenskap I

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Integraler av vektorfält Mats Persson

Fotorealistiska bilder 1 PV360 kap 1 7: Grunder samt material och dekaler i Photoview 360

τ ij x i ρg j dv, (3) dv + ρg j dv. (4) Detta samband gäller för en godtyckligt liten kontrollvolym och därför måste det + g j.

Poissons ekvation och potentialteori Mats Persson

Beräkningsvetenskap. Vad är beräkningsvetenskap? Vad är beräkningsvetenskap? Informationsteknologi. Informationsteknologi

Numeriska metoder för ODE: Teori

Teorifrågor. 6. Beräkna konditionstalet för en diagonalmatris med diagonalelementen 2/k, k = 1,2,...,20.

FYSIKENS MATEMATISKA METODER

* Läsvecka 1 * Läsvecka 2 * Läsvecka 3 * Läsvecka 4 * Läsvecka 5 * Läsvecka 6 * Läsvecka 7 * Tentamenssvecka. Läsvecka 1

LAB 3. INTERPOLATION. 1 Inledning. 2 Interpolation med polynom. 3 Splineinterpolation. 1.1 Innehåll. 3.1 Problembeskrivning

UPG5 och UPG8 Miniprojekt 1: 2D datorgrafik

Uppgift 1. Minimeringsproblemet löses med en Monte Carlo algoritm:

Anujan Balasingam IDA14 NAND flashminnen

SF1669 Matematisk och numerisk analys II Lösningsförslag till tentamen DEL A. r cos t + (r cos t) 2 + (r sin t) 2) rdrdt.

Interpolation Modellfunktioner som satisfierar givna punkter

Beräkningsvetenskap introduktion. Beräkningsvetenskap I

1 Cirkulation och vorticitet

Grafiska pipelinens funktion

Introduktionsföreläsning. Outline. Beräkningsvetenskap I. Sara Zahedi Hanna Holmgren. Institutionen för Informationsteknologi, Uppsala Universitet

MMA132: Laboration 2 Matriser i MATLAB

Konvergens för iterativa metoder

Teknik för avancerade datorspel!

Mekanik SG1108 Mekanikprojekt Dubbelpendel

Introduktionsföreläsning

Beräkningsuppgift I. Rörelseekvationer och kinematiska ekvationer

Spelutveckling 3d-grafik och modellering. Grunder för 3d-grafik Blender Animering

Ordinära differentialekvationer,

Bose-Einsteinkondensation. Lars Gislén, Malin Sjödahl, Patrik Sahlin

TANA17 Matematiska beräkningar med Matlab

Institutionen för matematik SF1626 Flervariabelanalys. Lösningsförslag till tentamen Måndagen den 5 juni 2017 DEL A

Simulering av kontaktkrafter och nötning i transportörsystem för malm

Simulering av brand i Virtual Reality

Föreläsning 14: Exempel på randvärdesproblem. LU-faktorisering för att lösa linjära ekvationssystem.

Föreläsning 16, SF1626 Flervariabelanalys

Flervariabelanlys och Matlab Kapitel 4

MATEMATIK GU. LLMA60 MATEMATIK FÖR LÄRARE, GYMNASIET Analys, ht Block 5, översikt

Sammanfattning av föreläsning 11. Modellbygge & Simulering, TSRT62. Föreläsning 12. Simulering. Föreläsning 12. Numeriska metoder och Simulering

Tentamen i Beräkningsvetenskap I/KF, 5.0 hp,

DGI/SUDOA Den historiska utvecklingen. Globala - lokala belysningsmodeller. Lokala belysningsmodeller. Rendering equation

FFM232, Klassisk fysik och vektorfält - Veckans tal

Numerisk modellering av självkompakterande betongs flöde diskret och kontinuumbaserad ansats

Aggregering av kapitalkrav i standardformeln i Solvens II. Magnus Carlehed

Tentamen del 1 SF1546, , , Numeriska metoder, grundkurs

Grafik raytracing. Mattias Axblom.

2D1210, Numeriska Metoder, GK I för V 2.

CHALMERS Finit Elementmetod M3 Institutionen för tillämpad mekanik. Teorifrågor

Mätning av fokallängd hos okänd lins

Uppgifter till kurs: Geometriska analys och designmetoder för olinjära system

Karta över Jorden - viktigt exempel. Sfär i (x, y, z) koordinater Funktionen som beskriver detta ser ut till att vara

Teknik för avancerade datorspel!

Skinning and Animation

Kurvor och ytor. Gustav Taxén

SF1669 Matematisk och numerisk analys II Bedömningskriterier till tentamen Måndagen den 16 mars 2015

Information Coding / Computer Graphics, ISY, LiTH. Integrationsmetoder

SF1626 Flervariabelanalys Tentamen Måndagen den 21 mars 2016

Matematisk analys för ingenjörer Matlabövning 2 Numerisk ekvationslösning och integration

Procedurella Grottor TNM084. Sammanfattning. Alexander Steen

Numerisk Analys, MMG410. Lecture 12. 1/24

Numerisk Analys, MMG410. Lecture 13. 1/58

2D1250 Tillämpade numeriska metoder II

Föreläsningen ger en introduktion till differentialekvationer och behandlar stoff från delkapitel 18.1, 18.3 och 7.9 i Adams. 18.

Tentamen i Beräkningsvetenskap I och KF, 5.0 hp,

Transkript:

ITN, Norrköping 20 mars 2011 Simulering och visualisering av en Eulerisk fluid på grafikkortet MODELLERINGS- OCH SIMULERINGSPROJEKT TNM085 Medlemmar: Christopher Birger Henrik Bäcklund Erik Englesson Anders Hedblom Per Karlsson Kontakt: chrbi049@student.liu.se henba892@student.liu.se erien139@student.liu.se andhe893@student.liu.se perka202@student.liu.se

Sammanfattning Fluidsimuleringar blir allt vanligare när avancerad mjukvara driver hårdvaruutvecklingen framåt. Att kunna modellera och simulera fluider som rök, vatten och eld har en stor betydelse inom många områden, så som film, spel och forskning, när det blir svårt eller omöjligt att använda en riktig fluid. Det finns givetvis olika sätt att genomföra detta på, beroende på vilket resultat som ska uppnås en grafiskt snygg men snabb simulering eller en mer realistisk sådan. Alla fluidsimuleringar bygger på Navier-Stokes ekvation och det finns i princip två synsätt för att lösa dessa. Antingen används partiklar (Langrageisk) eller så diskretiseras fluiden på ett rutnät (Eulerisk). På senare tid har man även använt en kombination av dessa. I den Euleriska metoden tittar man på fixa punkter i rymden och hur fluidkvantiteter som hastighet och tryck ändrar sig i tiden, istället för att följa partiklar. I den här rapporten implemeteras en Eulerisk lösning. Eftersom vi har valt att simulera vatten behövs något sätt för att representera dess yta. Till detta används level set-metoden. Nämnda metoder är mycket beräkningstunga och har varit näst intill omöjlig att utföra i realtid. Tack vare dagens kraftfulla grafikkort har det dock börjat bli fullt möjligt att simulera och rendera en 3D-fluid i realtid. Den här rapporten tar upp teori och tillvägagångssätt som använts för att skapa och visualisera en vattenliknande fluid med den Eulariaska metoden på datorns GPU. All kod är skriven av oss själva och inga externa bibliotek har använts. Projektets grundutformning var att, i grupp, skapa en modell av ett fysikaliskt fenomen och visualisera en simulering av denna. Arbetet hölls i kursen TNM085 - Modellbygge och Simuleringsprojekt på Linköpings universitet, vårterminen 2011.

Förord Att fullfölja detta projekt har varit vår största utmaning hittills, och motgångarna har varit många. Eftersom idén med att simulera en Eulerisk fluid på grafikkortet i realtid har blivit beprövad av få, har det varit svårt att få tag på svar till våra frågor. Vi vill ge ett stort tack till PhD Andreas Söderström, som tog sig tid att ses och ge förklaringar på våra frågeställningar och göra projektet genomförbart på så kort tid.

Innehållsförteckning 1 Inledning 1 1.1 Syfte........................................ 1 2 Metod 2 2.1 Beteckningar................................... 2 2.2 Begränsad rymd.................................. 2 2.3 Interpolation.................................... 3 2.4 Tidssteg...................................... 4 2.5 Implementering.................................. 4 2.5.1 GPU-programmering........................... 5 2.5.2 Offline-rendering............................. 5 2.5.3 Realtidssimulering............................ 6 2.6 Mjukvara..................................... 6 3 Grunderna hos en fluid 7 3.1 Navier-Stokes ekvation.............................. 7 3.2 Yttre krafter.................................... 7 3.3 Advektion..................................... 8 3.4 Extrapolering av hastigheterna.......................... 9 3.5 Projektion..................................... 9 3.6 Divergensfrihet.................................. 12 3.6.1 Dirichlets randvillkor........................... 12 4 Level set-metoden 13 4.1 Implicita ytor................................... 13 4.2 β- och γ-band................................... 13 4.3 Advektion..................................... 14 4.4 Reinitiering.................................... 15 5 Resultat 16 5.1 Realtid....................................... 16 5.2 Utrenderat..................................... 17 6 Avslutning 18 6.1 Diskussion..................................... 18 6.2 Vidare förbättringar................................ 18 Litteraturförteckning 21

Figurer 2.1 Rymdens uppdelning i mindre voxlar........................ 3 2.2 Definitionen av en MAC-ruta (Marker and Cell) i 2D............... 3 2.3 Interpolation i 2D................................. 4 2.4 Transformation från 3D-textur till 2D....................... 5 3.1 En punkt spåras ett tidsteg bakåt med den blå hastighetsvektorn. I den punkten interpoleras en hastighet fram med hjälp av omkringliggande hastigheter (röda vektorer)...................................... 8 3.2 Bild till exempel (3.17)............................... 11 3.3 Bild på innan och efter Dirichlets randvillkor uppfyllts............. 12 4.1 Allt inom den svarta gränsen är fluid. Det gröna fältet är β-band och det streckade är γ-band................................ 14 5.1 Resultat...................................... 16 5.2 Resultat...................................... 17

Kapitel 1 Inledning Det finns många anledningar till varför man skulle vilja visualisera simuleringsbara modeller av fluider. Specialeffekter till film, miljöer i spel eller avancerade tester inom andra industrier, bara för att nämna några. Exempel på effekter som går att återskapa väldigt bra med fluidsimuleringar är rök och eld, men i det här projektet handlar det om att skapa vatten, med ett realistisk utseende och beteende. Det finns olika sätt på hur man kan skapa en datorgenererad fluid. En metod som har blivit omtyckt inom branschen för specialeffekter, är den partikelbaserade SPH-metoden (Smoothed Particle Hydrodynamics). Den bygger på att man har en stor mängd partiklar, var och en med fysikaliska egenskaper som massa och kollisionshantering. En fördel med SPH är att metoden ger ett visuellt tilltalande resultat i scener där det är mycket stänk. Ett problem är dock att en SPH-fluid aldrig kan ligga riktigt still. Dess yta kommer att ha en konstant vibration. Därför lämpar sig exemplevis inte SPH i en scen där vattnet ska ligga still. Ett annat tillvägagångssätt är med den så kallade Euleriska metoden. Den baserar sig på att, istället för att använda partiklar, beskriva fluiden med hjälp av en fix yttre domän uppdelad i celler/voxlar. För att beskriva ytan används level set-metoden [1]. Det är den här metoden som har använts i detta projekt, och dess olika steg och problem, som kan uppstå, beskrivs i rapporten. 1.1 Syfte Syftet med denna rapport är bland annat att: Öka förståelsen för hur en fluid kan vara uppbyggd Förklara den Euleriska metoden och värdefulla användningsområden för den Dokumentera för- och nackdelar med metoden Ge insikt i vilka problem som kan uppstå 1

Kapitel 2 Metod 2.1 Beteckningar Beteckningar som används genom rapporten är: Skalärer gemener (t), Matriser versaler (A), Vektorer/vektorfält gemener med sträck ( u) 2.2 Begränsad rymd För att kunna utföra alla numeriska beräkningar på datorn måste en begränsad rymd definieras samt diskretiseras. Diskretisering utförs genom att volymen delas in i så kallade voxlar (figur 2.1). Om en volym med dimensionerna 1x1x1m skall delas in i 64x64x64 voxlar fås en voxelstorlek, h, på 1/64 m. Finare diskretisering ger högre upplösning men flera beräkningar. Varje voxel har en mittpunkt, sex sidor och 12 kanter med längden h. I denna implementation används ett så kallat MAC-grid (Marker and Cell). Detta innebär att hastigheter sparas i mitten av varje sida medan tryck sparas i mitten av varje voxel. Denna metod valdes då precisionen i uträkning av tryckgradienter samt divergens bli mer exakta [2]. 2

Figur 2.1: Rymdens uppdelning i mindre voxlar. Figur 2.2: Definitionen av en MAC-ruta (Marker and Cell) i 2D. 2.3 Interpolation Ett problem som uppstår vid en diskretisering som denna är att det enbart finns diskreta värden med ett visst mellanrum att jobba med. Oftast kommer man bli tvungen att hämta värden som inte finns i positionerna mellan de diskreta gränserna. En interpolation blir tvungen att utföras. Det vill säga, värden runt omkring positionen i fråga viktas och slås ihop. Ett exempel på enkel linjär interpolation i två dimensioner kan ses i figur 2.3. I tre dimensioner kan enkel trilinjär interpolation användas, men för ett mer korrekt värde bör interpolation av högre ordning användas. 3

Figur 2.3: Interpolation i 2D. I projektet används en Monoton Catmull-Rom-interpolation [3] som är av ordning två. Detta är en kubisk interpolation som utnyttjar derivator vid viktningen. Dessa derivator tas fram genom central differensapproximation. 2.4 Tidssteg Tidssteget t väljs så att det garanterar ett CFL-tillstånd (Courant-Friedrichs-Levy s tillstånd) [1]: h t = k (2.1) max(u x + u y + u z ) Detta medför att information maximalt kan transporteras en voxel per tidssteg. Konstanten k används för att skala tidsteget i (2.1). För att vara säker på att CFL-tillståndet uppfylls bör k ligga mellan noll och ett. Ett problem som kan uppstå med detta stabilitetsvillkor är att när hastigheten hos fluiden ökar, sjunker tidssteget proportionellt mot denna. En mycket hög hastighet ger ett mycket litet tidssteg. Det tar dock fortfarande lika lång tid för datorn att utföra beräkningarna under ett tidssteg. 2.5 Implementering Hela arbetet är kodat med C++. CUDA C [4] har i sin tur använts för att kunna implementera beräkningarna på grafikkortets processor. Fluiden kan visuliseras antingen i realtid med hjälp av OpenGL eller renderas ut offline. En iteration i fluidsimuleringen ser ut som följande: 1. Räkna ut ett tidssteg 2. Extrapolera hastighetsfältet i β-bandet 3. Lägg till externa krafter till hastighetsfältet 4. Advektera hastighetsfältet och level setet 4

5. Reinitisering av β- och γ-band 6. Lös tryckekvation för den nya fluiddomänen 7. Uppdatera hastighetsfältet genom att subtrahera tryckgradienten. Stegen beskrivs i kapitel 3 och 4. 2.5.1 GPU-programmering För att programmera instruktioner till grafikkortet har Nvidia CUDA använts som tillåter mer parallellism än vad en CPU gör. För att anropa en funktion (en så kallad kernel) på GPU n, körs koden parallellt över block. Totalt kan ca 65 000 block köras, där varje block i sin tur kan delas upp i trådar. Antal trådar beror på grafikkortet och för att göra fluidlösaren kompatibel med en större mängd grafikkort, används 256 trådar per block. Nästan alla algoritmer körs över en specifik kvantitet (t.ex. hastigheter, tryck eller level set). Varje kernel anropas med tillräckligt många block så att varje tråd får en egen cell/yta att arbeta med. CUDA tillåter att binda minnesplatser på grafikkortet till en textur för snabb inläsning av data, det vill säga, om data på en minnesplats ändras så kommer texturen dynamiskt att uppdateras. Användning av texturer är ett kraftfullt verktyg då lokalitet kan utnyttjas. Om ett texturvärde har lästs i en punkt, går det snabbt att läsa i samma textur i närliggande punkter. Tyvärr går det inte i dagsläget att dynamiskt skriva till 3D-texturer i CUDA, något som hade varit optimalt för en simulering i tre dimensioner. Istället är den påtänkta 3D-texturen uppdelad i skivor som läggs ut som en enda stor 2D-textur. Lokalitet bevaras då fortfarande i två dimensioner men förloras i den dimension som skivorna representerar. Figur 2.4: Transformation från 3D-textur till 2D. 2.5.2 Offline-rendering All offline-rendering är utförd i 3Ds Max, som får in en 3D-modell att jobba med. 3D-modellen räknas ut för varje bildruta med metoden Marching cubes [5], där utvalda punkter i voxelrymden används för att skapa polygoner. 5

2.5.3 Realtidssimulering Med hjälp av strålar kan level setet renderas ut till skärmen. För att uppnå realtidssimulering måste denna process vara snabb, något som gör det svårt att spåra strålar (raytracing) och få en fotorealistisk rendering. Istället implementeras en enkel raycaster som marscherar i en stråles riktning genom level setet tills den träffat en punkt som ligger på ytan [6]. Där används enkel trilinjär interpolation av normaler för att få mjuka övergångar mellan voxlar. Scenen renderas med valfri shadingmetod (förslagsvis Phong-shading [7]) i två pass för att återge transparens och refraktioner. I det första passet renderas omgivningen och den lagras i en textur. I det andra passet renderas fluiden och beroende på givet transparens-värde, interpoleras de två passens renderingar. För att simulera refraktioner används en fusklösning som utnyttjar normalens riktning mot kameran [8]. 2.6 Mjukvara Microsoft Visual Studio 2010 Autodesk 3Ds Max MATLAB 6

Kapitel 3 Grunderna hos en fluid 3.1 Navier-Stokes ekvation För att kunna simulera en fluid behövs en modell som beskriver dess beteende matematiskt. Modellen som används är den så kallade Navier-Stokes-ekvationen (3.1) som innehåller termerna advektion, tryck, yttre krafter och viskositet. u t + u u + 1 p = g + ν u (3.1) ρ Ekvationen (3.1) måste dock förenklas vid simulering. Den ska också se till att fluidens volym bevaras. Därför läggs ekvation (3.2) till som ett villkor på att fluiden ska vara okomprimerbar det vill säga att hastighetsfältet ska vara divergensfritt. u = 0 (3.2) En ytterligare förenkling på Navier-Stokes-ekvationen är att ta bort viskositetstermen (ν u) i beräkningarna. Detta på grund av att den inte är viktig vid vattensimulering i och med att de numeriska felen ger nog med viskositet ändå. De termer som återstår kommer att förklaras senare i rapporter. Den sista förenklingen är att dela upp termerna i (3.1) och lösa de var för sig vilket kommer underlätta beräkningarna. Detta benämns splitting. 3.2 Yttre krafter För att fluiden ska kunna påverkas utifrån behövs delen i Navier-Stokes-ekvationen som behandlar yttre krafter. Utan denna skulle fluiden aldrig röra på sig. Yttre krafter kan innefatta t.ex. gravitation eller vind. I det här projektet är den enda yttre kraften gravitation. Eftersom fluiden inte har någon virtuell massa kan vi se gravitationskraften som ren acceleration, som i sin tur kan omvandlas till hastighet genom att integreras över tiden. Då hela simuleringen sker i diskreta steg fås den nya hastigheten genom ekvation (3.3), där g är gravitationen: u n+1 = u n + g t (3.3) 7

3.3 Advektion Advektionsdelen i Navier-Stokes ekvation handlar om att propagera hastigheterna i hastighetsfältet. När fluiden rör på sig måste hastighetsvektorerna, i de voxlar som fluiden sveper över, få nya värden, sådana att fluiden behåller sin hastighet. Rent matematiskt skulle det kunna ställas upp som (3.4): q n+1 = advektera( q n, t, qn t ) (3.4) Så hur går det till? Plockas advektionsdelen ut ur (3.1) kan den ställas upp på följande vis: u n+1 t = ( u n ) u n (3.5) Eftersom hur små tidssteg som helst inte kan tas är det, i detta fall, inte lämpligt att använda sig av vanlig Euler-integration då metoden är instabil. Till slut skulle värden bli extremt felaktiga, när tidssteget blir stort, och fluiden skulle inte längre bete sig normalt. Vad som istället utförs är att en fiktiv partikel får spåras ett tidssteg bakåt i rymden. Den här metoden är stabil för alla tidssteg och kallas Semi-Lagrangeisk metod [9] semi, just för att någon verklig partikel aldrig skapas. Då metoden använder sig av två tidpunkter för att fungera, krävs också två kopior av hastighetsfältet; ett vars värden uppdateras, och används som sikte bakåt i tiden samt ett där gamla värden hämtas ifrån. Figur 3.1: En punkt spåras ett tidsteg bakåt med den blå hastighetsvektorn. I den punkten interpoleras en hastighet fram med hjälp av omkringliggande hastigheter (röda vektorer). Att bara gå ett enstaka steg bakåt i tiden och plocka ett värde där är oftast inte särskilt precist. För att öka precision har en integrationsmetod av högre ordning implementerats, Runge-Kutta ordning 4. Men Eulers stegmetod ger vid bakåtsteget ett acceptabelt resultat. När en punkt bakåt i tiden har identifierats gäller det att få ut en hastighet från just den punkten. Högst troligt är att en punkt ligger mellan voxelytor där hastigheter finns sparade, vilket innebär att interpolation (se avsnitt 2.4) krävs. För att få ett ännu bättre resultat i advektionssteget används även en metod som kallas Back-and-Forth Error Compensation and Correction (BFECC) [10]. Vad detta innebär är att hastigheten som används för att advektera bakåt i tiden korrigeras med ett antal steg, enligt 8

ekvation (3.6). ˆφ n+1 = Advektera(φ n ) ˆφ n = Advektera 1 ( ˆφ n+1 ) φ n 2 = (3φ n ˆφ n )/2 φ n+1 = Advektera(φ n 2) (3.6) Där φ är hastigheten som ska advekteras. Advektera 1 betyder att advektionen skall utföras framåt i tiden istället för bakåt. 3.4 Extrapolering av hastigheterna En oklarhet kvarstår; vad händer om advektionsdelen i (3.1) blir tillbedd att hämta ett värde utanför fluiden, där inga hastigheten är definierade? Det innebär problem. Man vill alltså se till att det alltid finns hastigheter en liten bit utanför fluidens yta. Hastigheter extrapoleras hela tiden ut från fluiden så att det alltid finns värden att plocka så långt ut som till gränsen på level setets β-band (se avsnitt 4.2). Vilka hastigheter som än befann sig utanför fluiden blir överskrivna under extrapoleringen. Ekvation (3.7) används för att utföra detta repetitivt. u t = ˆn u (3.7) där u är hastighetsfältet och ˆn är normalerna till ytan. Detta kan kombineras med level setets reinitiering (se avsnitt 4.4), som vet var de närmsta punkterna på ytan finns och en hastighet kan hämtas. 3.5 Projektion Projektionen handlar om att lösa tryckdelen (3.8) av Navier-Stokes-ekvationen som gör hastighetsfältet divergensfritt. Där högerledet i (3.8) består av densiteten ρ och tryckfältet p. I det här tillståndet har advektion samt externa krafter applicerats på u. Projektionen är den beräkningstyngsta delen av simuleringen i och med att trycket i vektorfältet ändras samtidigt som divergensvillkoret (3.2) och randvillkoret ska uppfyllas. u n+1 = u t 1 p (3.8) ρ Eftersom p i ekvation (3.8) är okänd måste detta tryckfält bestämmas. Helmholtz-Hodge dekomposition måste utnyttjas vilken säger att ett vektorfält kan delas upp i ett divergensfritt samt rotationsfritt fält. u = u d + k p (3.9) Där u d i är den divergensfria delen och p är den rotationsfria delen i ekvation (3.9). Både u d och p är okända. Om vi låter divergensoperatorn operera på (3.9) fås: u = u d + k 2 p = k 2 p (3.10) Eftersom den okända u d termen är divergensfri förkortas den bort från ekvation (3.10) och nu kan p lösas ut. 9

t ρ 2 p = u (3.11) Nästa steg är att lösa Poissons ekvationen (3.11). För att kunna göra det numeriskt måste ekvationen diskretiseras och vi börjar med högerledet som visas i ekvation (3.12) där u, v, w är x-, y- och z-komponenterna för vektorerna i vektorfältet u. Divergensen räknas bara ut i celler som innehåller fluid. ( u) i,j,k u i+1/2,j,k u i 1/2,j,k + v i,j+1/2,k v i,j 1/2,k + w i,j,k+1/2 w i,j,k 1/2 (3.12) h h h Nästa steg är att diskritisera vänsterledet som blir följande t ρ 2 p = t ( ) 6pi,j,k + p i+1,j,k + p i,j+1,k + p i,j,k+1 + p i 1,j,k + p i,j 1,k + p i,j,k 1 ρ h 2 (3.13) Den riktiga betydelsen av vänsterledet är att laplaceoperatorn beskriver växlingen mellan de olika elementen i voxeln, som bearbetas, och dess grannar. Den kan även skrivas i vektorform vilket kommer behövas när Poissons ekvation ska lösas. Högerledet uttryckt i vektorer: t ρ 2 p = p i,j,k p i+1,j,k t [ ] p i,j+1,k 6 1 1 1 1 1 1 ρ h 2 p i,j,k+1 p i 1,j,k p i,j 1,k p i,j,k 1 (3.14) Med högerledet och vänsterledet diskretiserade återstår det att lösa Poissons ekvation (3.11) och för det måste även den skrivas i vektorform/matrisform: A x = b (3.15) I det linjära systemet (3.15) är A = 2, x = p och b = u. Detta ger att x ska lösas ut, det vill säga inversen till A ska hittas. För att få en inblick i vad som egentligen händer i ekvation 3.14 så förklaras detta med ett exempel. Det intressanta i ekvationen är radvektorn [ 6 1 1 1 1 1 1 ] i ekvation (3.14), som refererar till om en voxel och dess grannar innehåller fluid, luft eller solid. Ettor betyder att voxlarna innehåller fluid eller solid och nollor om voxlarna innehåller luft. Om en voxel utgörs av en solid behövs ett uttryck (3.16) för att beräkna trycket i voxeln och samtidigt upprätthålla Neumans villkor [11]. Om en voxel till höger är solid, fås trycket i denna voxel genom: p i+1,j,k = p i,j,k + ρ h t (u i+1/2,j,k u solid ) (3.16) Ekvation (3.16) ersätter då p i+1,j,k i ekvation (3.14). Ett 2D-exempel ser ut som följande: p i,j t [ ] p i,j + ρ h 4 1 0 1 1 (u t i+1/2,j u solid ) ρ h 2 p i,j+1 p i 1,j p i,j 1 (3.17) 10

Där p i+1,j är en solid och p i,j+1 är fylld med luft vilket representeras av en nolla i radvektorn. Figur 3.2: Bild till exempel (3.17). 11

3.6 Divergensfrihet Ett villkor, som är mycket viktigt när fluider som vatten simuleras, är att den ska vara inkompressibel. Volymen ska med andra ord vara konstant hela tiden. Ett villkor som kanske ses som självklart men som faktiskt inte är helt trivialt. Divergens i ett vektorfält kan ses som flödet i en viss punkt. Om divergensen är positiv strömmar det ut mer från punkten än vad det kommer in. Är flödet mot punkten större än flödet ut är divergensen negativ. Under simuleringen måste det gälla att hela fluiden är divergensfri, det vill säga, differensen mellan flödet in och ut är lika med noll. På grund av att det blir en hel del approximationer under simuleringen är det svårt att behålla en konstant volym på fluiden. Ofta komprimeras den och det ser ut som att vätska försvinner spårlöst. Ett trick för att lösa detta problem att göra en direkt modifiering på Poisson-ekvationen under tryckberäkningarna [12]. Om fluidens volym approximativt kan mätas under varje tidpunkt, genom att räkna hur många voxlar som har ett negativt värde, kan denna jämföras med volymen vid initiering. Differensen kommer att ge hur mycket volym som saknas och denna differens skalas med en konstant och används i divergensdelen i Poisson-ekvationen. 3.6.1 Dirichlets randvillkor Anledningen till att en fluid inte kan strömma in i en solid är att soliden alltid kan motsätta ett lika högt tryck mot fluiden som fluiden utgör på den. Detta måste såklart även gälla i simuleringen om vattnet ska stanna kvar i akvariet. För att tillämpa detta används Dirichlets randvillkor (3.18) [11], som säger att hastigheter i närliggande soliders motsatta normalriktning måste vara noll. Med andra ord, det får inte existera några vektorkomposanter, i hastighetsfältet, som pekar in mot en solid. Figur 3.3: Bild på innan och efter Dirichlets randvillkor uppfyllts När soliden i fråga har en hastighet så gäller: u ˆn = u solid ˆn (3.18) där ˆn är normalen till soliden, u är fluidens hastigheter och u solid är solidens hastighet. Eftersom det här projektet endast innefattar simulering med stillastående solider kan följande ekvation alltså användas: u ˆn = 0 (3.19) Det är önskvärt att Dirichlets randvillkor är uppfyllt under hela simuleringen. Därför körs operationen flera gånger för varje bildruta, mellan de olika uträkningarna. 12

Kapitel 4 Level set-metoden Level set-metoden handlar om att förklara fluidens form och position med implicita ytor. Det här kapitlet förklarar endast de allra grundligaste stegen för att använda metoden. 4.1 Implicita ytor Med hjälp av level set-metoden kan fluidens form hela tiden representeras som en implicit yta. En implicit yta har bland annat den fördel att den inte kan skapa tvetydighet om var ytan är genom att korsa sig själv. När två ytor överlappas slås de ihop och bildar en ny yta. Avståndet till fluidens yta ges genom ekvationerna (4.1) och (4.2): Distans inne = {x(t) R 2 : φ(x(t)) 0} (4.1) Distans ute = {x(t) R 2 : φ(x(t)) > 0} (4.2) Detta ger att närmsta avståndet φ till fluidens yta kan hittas oavsett position i rymden. Ett negativt φ-värde betyder att punkten är inuti fluiden och ett positivt värde utanför. När φ är exakt noll ligger punkten på ytan. 4.2 β- och γ-band Vid simulering är det endast intressant att veta var fluidens yta befinner sig. Därför behövs det bara ett definierat level set i omgivningen av ytan. Ett β-band begränsar level setets utsträckning utanför fluidens yta, där konstanten β avgör hur lång denna utsträckning är. Beroende på integrationsmetod i advektionen (se avsnitt 4.3) krävs olika värden på β. För ett vanligt Euler-steg räcker det med att β har ett värde motsvarande 2 h. För att försäkra sig om att korrekta derivator finns i β-bandet utvidgas level setet med ytterligare ett band, γ-bandet, som i regel är smalt. 13

Figur 4.1: Allt inom den svarta gränsen är fluid. Det gröna fältet är β-band och det streckade är γ-band. 4.3 Advektion Enligt avsnitt 2.5 uppfylls CFL-tillståndet med valt tidssteg. Detta är viktigt för att level setet inte ska kollapsa. För att propagera ytan i tiden utförs ett advektionssteg utifrån det divergensfria hastighetsfältet med ett enkelt Euler-steg. Advektion utförs bara på celler som ligger innanför β-bandet. φ φ(n + 1) φ(n) (4.3) t t φ = u φ (4.4) t Gradienten till φ behövs alltså räknas ut och för det används ett upwind scheme, som i en dimension ser ut som: { φ x φ + x = (φ i+1,j,k φ i,j,k )/ x, if u x < 0 (4.5) φ x = (φ i1,j,k φ i 1,j,k )/ x, if u x > 0 Detta säger att information endast färdas i hastighetsfältets riktning och derivator tas fram genom att bara kolla på skillnader där fluiden har befunnit sig. 14

4.4 Reinitiering Både Eulersteget och approximeringen av gradienten introducerar fel i φ(n + 1). Eftersom advektionen dessutom endast utförs i punkter inom β-bandet (se figur 4.1) initieras ett nytt β-band i varje iteration i fluidsimuleringen. Detta kan göras med en geometrisk metod [13], som tar fram vilka punkter som ligger i närheten av ytan. Utifrån dessa punkter utvidgas level setet iterativt tills hela β-bandet är fyllt. Därefter skapas även ett nytt γ-band. 15

Kapitel 5 Resultat 5.1 Realtid Resultatet blev en vattenliknande fluid i tre dimensioner. Fluiden liknar vatten, inte bara visuellt utan också rent beteendemässigt, vilket fortfarande är knepigt att uppnå med denna metod. Vad som vanligtvis inträffar är att fluiden får en alldeles för hög viskositet och liknar mer glycerol eller sirap. Eftersom metoden inte är partikelbaserad ges dock inga riktiga stänk-effekter, som riktiga vattenrörelser brukar ge upphov till. Bild på fluiden i realtid: Figur 5.1: Resultat 16

5.2 Utrenderat Bild på hur fluiden ser ut när den fått renderas ut i 3Ds Max, med fysikaliskt korrekt hdri-belysning och ray-tracing-metoden Mental ray: Figur 5.2: Resultat 17

Kapitel 6 Avslutning 6.1 Diskussion Fluidsimulering är minst sagt en komplicerad process. Det finns en hel del information att hitta om level set-metoden, både välskrivna rapporter och hemsidor. Det knepiga och mest motsträviga under resans gång har dock varit att implementera allt på datorns grafikkort. Det blir ett helt annorlunda tänk när beräkningar ska parallelliseras och optimeras för att samma funktion ska kunna ge olika resultat på olika kärnor, värden ska sparas i texturer istället för arrayer och så vidare. Ett kvarstående problem är simuleringens alla approximationer. Numeriska fel, i följd av diskretiseringarna, gör att det kommer att bli vissa ej helt korrekta beteenden hos fluiden, bland annat volymförlusten. Det som begränsar hur fina beräkningar som kan göras är datorns prestanda. 6.2 Vidare förbättringar Det finns ett stort antal förbättringar, som kan göras med denna fluidsimulering, för att ge den ett än mer vattenliknande beteende. Det finns även åtgärden som kan göra den mer fysikaliskt korrekt. Det första som kommer på tanke är problemet med volymförluster. Sättet detta är löst på är ett mycket overkligt sådant. Att skapa volym ur ingenting genom att förstöra en fysikaliskt korrekt ekvation är inte optimalt. Det är dock en simpel lösning som fungerar bra rent visuellt, och i många fall handlar datagrafik bara om att någonting ska se bra ut. Den här metoden skulle inte vara acceptabel i forskningssammanhang. När det handlar om att få till effekter som stänk och separationer av fluiden blir man i princip tvungen att bygga vidare på arbetet med en metod som kallas FLIP (fluid-implicit partikel). Det är en Eulerisk fluidlösare som använder partiklar för advektion. [14] För varje kernel anropar CUDA tillräckligt många block så att varje tråd får enbart en cell att arbeta på. Det hade varit intressant att undersöka om det hade gått snabbare i realtid om varje tråd fått jobba med flera celler åt gången [15]. Styrkan i denna metod hade varit möjligheten till att lagra värden i Shared Memory vilket är ett minne som varje block delar mellan sig och dessutom är betydligt snabbare än att läsa från textur och globalt minne [16]. Realtidsrenderingen lider tyvärr lite av artefakter som orsakats av cellstorleken, trots att trilinjär interpolation använts. Det borde vara möjligt att innan varje rendering skapa en statisk 3D-textur av level setet, raycasta den och använda trikubisk interpolation av normaler vid ytan. 18

Då går det att använda grafikkortets egna process av filtrering (som är lika snabb som vanlig texturläsning) och använda endast 8 texturläsningar istället för 64 som trikubisk interpolation vanligtvis kräver [17]. 19

Litteraturförteckning [1] Osher S, Fedkiw R. Level Set methods and Dynamic Implicit Surfaces. Los Angeles: Springer; 2003 [2] Bridson R. Fluid Simulation for Computer Graphics. s. 21-25. Wellesly: A K Peters; 2008 [3] Fedkiw R, Stam J, Jensen H. W. Visual Simulation of Smoke. Standford University. http: //physbam.stanford.edu/ fedkiw/papers/stanford2001-01.pdf; Senast hämtad 2011-03-15 [4] Sanders J, Kandrot E. CUDA by Example - An Introduction to General-Purpose GPU Programming. Boston: Addison-Wesley; 2010 [5] Bourke P. Polygonising a Scalar Field. 1994. http://paulbourke.net/ geometry/polygonise/; Senast hämtad 2011-03-08 [6] Hadwiger M, Sigg C, Scharsach H, Bühler K, Gross M. Real-TIme Ray-Casting and Advanced Shading of Discrete Isosurfaces. Eurographics: M. Alexa, J. Marks; 2005 [7] Watt A. 3D Computer graphics. s. 171-183. Harlow: Pearson, Addison-Wesley; Third edition 2010 [8] Crane K, Tariq S. Real-Time Simulation and Rendering of 3D-fluids. Nvidia. http:// http.developer.nvidia.com/gpugems3/gpugems3_ch30.html; Senast hämtad 2011-03-08 [9] Stam J. Stable Fluids. Alias Wavefront. http://www.dgp.toronto.edu/ people/stam/reality/research/pdf/ns.pdf; Senast hämtad 2011-03-08 [10] Liu Y, Dupont T. F. Back and Forth Error Compensation and Correction Methods for Removing Errors Induced by Uneven Gradients of the Level Set Function. s. 311 324. J. Comput. Phys; 2003 [11] Läthén G, Nilsson O, Söderström A. Fluid Simulation. LiU, TNM079, Modeling and Animation, Lab6; 2010 [12] Söderström A. Memory Efficient Methods for Eulerian Free Surface Fluid Animation. Linköpings universitet, ITN; 2010 [13] Tsai Y.-H. R. Rapid and Accurate Computation of the Distance Function Using Grids. s. 175-195. J. Computing Physics; 2002 [14] Zhu Y, Bridson R. Animating Sand as Fluid. ACM Trans. Graph; 2005 20

[15] Brandvik T, Pullan G. Acceleration of a 3D Euler Solver Using Commodity Graphics Hardware. Cambridge, University of Cambridge; 2008. http://www.eng.cam.ac. uk/ gp10006/research/brandvik_pullan_2008a_draft.pdf; Senast hämtad 2011-03-13 [16] Nvidia. CUDA Programming Guide. 2008. http://developer.download. nvidia.com/compute/cuda/2_0/docs/nvidia_cuda_programming_ Guide_2.0.pdf; Senast hämtad 2011-03-13 [17] Sigg C, Hadwiger C. Fast Third-Order Texture Filtering. Nvidia. http://http. developer.nvidia.com/gpugems2/gpugems2_chapter20.html; Senast hämtad 2011-03-08